Почему мой запрос MySQL такой медленный? - PullRequest
3 голосов
/ 23 июня 2010
Background:
entities tables currently has 14,111 records
articles table currently has 5211 records

Я пытаюсь найти все статьи, которые активны (завершены) и имеют сущность "google"

# Finding articles that have the entity google takes:
# 4 ms
SELECT `Article`.`id` FROM `articles_entities` AS `ArticlesEntity`
LEFT JOIN `entities` AS `Entity` ON (`ArticlesEntity`.`entity_id` = `Entity`.`id`)
WHERE `Entity`.`strict` = 'google'

# Finding articles that have the entity google and is active takes:
# 1800 ms
SELECT `Article`.`id` FROM `articles_entities` AS `ArticlesEntity` 
LEFT JOIN `entities` AS `Entity` ON (`ArticlesEntity`.`entity_id` = `Entity`.`id`)
LEFT JOIN `articles` AS `Article` ON (`ArticlesEntity`.`article_id` = `Article`.`id`)
WHERE `Entity`.`strict` = 'google' AND `Article`.`state` = 'completed'

В чем может быть проблема с длительностью запроса?

Я бы добавил, что оба поля в сводной таблице проиндексированы.

Заранее спасибо за помощь

UPDATE

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Entity ref PRIMARY,strict strict 767 const 1 Using where
1 SIMPLE ArticlesEntity ref article_id,entity_id,article_id_2 entity_id 108 b2b.Entity.id 4  
1 SIMPLE Article eq_ref PRIMARY,state PRIMARY 108 b2b.ArticlesEntity.article_id 1 Using where

Ответы [ 2 ]

1 голос
/ 23 июня 2010

тебе действительно нужно левое соединение ?!imho ваш запрос должен получить повышение без него;)

1 голос
/ 23 июня 2010

Entity.strict или Article.state не индексируются. Используйте EXPLAIN перед оператором SELECT и проверьте, какие таблицы полностью сканируются. Это намекает на то, что нужно индексировать.

...