MySQL запрос работает очень медленно для большой базы данных - PullRequest
1 голос
/ 24 августа 2010

Я пытаюсь извлечь дубликаты строк из моей базы данных. У меня есть таблица списков и таблица lists_meta, которая содержит дополнительную информацию. Таблица lists_meta содержит более 16 000 строк. Когда я запускаю запрос ниже, он работает очень медленно.

Я не понимаю, почему. Что-то не так с моим кодом?

SELECT l.id FROM listings AS l
   LEFT JOIN listings_meta AS lm ON lm.listing_id = l.id AND lm.meta_key = 'email'
   LEFT JOIN listings_meta AS lm2 ON lm2.listing_id = l.id AND lm2.meta_key = 'submitter_email'
   WHERE lm.meta_value = 'test@test.com' OR lm2.meta_value = 'test@test.com' OR l.listing_title RLIKE 'Test'
   GROUP BY l.id LIMIT 1

Могу ли я сделать определенные вещи для улучшения времени загрузки больших таблиц в целом?

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

Индексы

Есть ли у вас какие-либо индексы - особенно по LISTINGS_META.listing_id?

Я переписал ваш запрос как:

   SELECT l.id 
     FROM listings AS l
LEFT JOIN listings_meta AS lm ON lm.listing_id = l.id 
                             AND lm.meta_key = 'email'
                             AND lm.meta_value = 'test@test.com'
LEFT JOIN listings_meta AS lm2 ON lm2.listing_id = l.id 
                              AND lm2.meta_key = 'submitter_email'
                              AND lm2.meta_value = 'test@test.com'
    WHERE l.listing_title RLIKE 'Test'
 GROUP BY l.id LIMIT 1

ГДЕ предложение

RLIKE (любая функциональность регулярного выражения MySQL в этом отношении) находится на одном уровне с:

WHERE l.listing_title LIKE '%Test%'

Никто не может использовать индекс для столбца LISTING.listing_title ...

Лучший способ улучшить поиск listing_title был бы, если бы таблица LISTING была MyISAM, поэтому вы могли бы добавить полнотекстовый индекс в столбец LISTING.listing_title, чтобы использовать:

WHERE MATCH(l.listing_title) AGAINST ('Test')

... но учтите, что минимальная длина слова составляет 3 символа для полнотекстового поиска (FTS) ....

2 голосов
/ 24 августа 2010

Есть ли у вас индексы для list_id и meta_key? У вас должен быть индекс для любого поля, по которому вы собираетесь сортировать или сопоставлять, потому что в противном случае mysql должен пройти всю таблицу, чтобы найти каждую строку.

Вы также можете добавить EXPLAIN к оператору, чтобы увидеть, как mysql выполняет поиск.

...