mysql низкая производительность на маленькой таблице с запросом соединения - PullRequest
3 голосов
/ 07 октября 2011

У меня есть пара таблиц, которые я объединяю, когда выполняю следующий запрос:

SELECT article.year, authors.last_name, count(DISTINCT article.id) as count FROM
article LEFT JOIN authors ON article.id = authors.id WHERE authors.last_name =
'bloggs' GROUP BY article.year

По некоторым причинам, это занимает от 6 до 7 секунд, чтобы вернуть результаты, которые мне кажутся невероятно медленными, учитывая относительно небольшое количество строк, с которыми приходится иметь дело. Я что-то здесь не так делаю?

Если я запускаю EXPLAIN для запроса, я получаю следующее:

select_type    table    type   possible_keys  key    key_len    ref    rows    extra
=====================================================================================
simple         article  all    null           null    null      null   762     using temporary; using filesort
simple         authors  all    null           null    null      null   5061    using where; using join buffer

Обе таблицы являются InnoDB. Я запускаю это с моей локальной машины, которая имеет довольно низкие характеристики (windows xp, 1 ГГц, 1 ГБ ОЗУ), но даже в этом случае я бы подумала, что это будет быстрее. Если я загружу еще несколько строк в таблицы, это займет минуты, а не секунды.

Есть мысли?

Структура таблицы ниже:

Article:

field    type       null    key    default    extra
=======================================================
id       int        yes            null
year     char(20)   yes            null
volume   char(20)   yes            null
issue    char(20)   yes            null
title    text       yes            null

Authors:

field      type       null    key    default    extra
=======================================================
id         int        yes            null
last_name  char(100)  yes            null
initials   char(10)   yes            null

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Попробуйте добавить индексы для столбцов authors.last_name и authors.id.

Но вы уверены, что ваш запрос в порядке?не должно ли это выглядеть так:

SELECT article.year, authors.last_name, count(DISTINCT article.id) as count FROM
article LEFT JOIN authors ON article.author_id = authors.id WHERE authors.last_name =
'bloggs' GROUP BY article.year

Если это так, потребуется индекс на articles.author_id - хотя, не для этого запроса, а в качестве общей рекомендации

0 голосов
/ 07 октября 2011

Как сказал Тудор, добавьте индексы. Вы также можете извлечь группу с помощью.

SELECT * FROM (SELECT article.year, authors.last_name, count(DISTINCT article.id) as count FROM
article LEFT JOIN authors ON article.author_id = authors.id WHERE authors.last_name =
'bloggs') GROUP BY article.year

Делая это, вы сначала выбираете с помощью объединения, а в наборе применяете агрегатную функцию.

И explain, чтобы увидеть, где находится место для улучшения.

Шрифт предложения:

http://kccoder.com/mysql/join-group-by-performance/

...