2008-11-13 6 views
0

Я использовал для этого:Почему MySQL не использует индекс для этого подзапроса?

SELECT layerID 
FROM layers 
WHERE ownerID = ? 
AND collectionID = ? 

Который даст мне массив LayerId, а затем я бы петлю и сделать это для каждого из них:

SELECT DATA 
FROM drawings 
WHERE layerID = ? 

И все это работало нормально. Так что теперь я пытаюсь сделать это за один шаг, так что я стараюсь это:

SELECT DATA , layerID 
FROM drawings 
WHERE layerID = ANY (
    SELECT layerID 
    FROM layers 
    WHERE ownerID = ? 
    AND collectionID = ? 
) 

Но по какой-то причине, он не использует индекс, для основного запроса, SELECT DATA etc! Таким образом, этот объединенный запрос занимает гораздо больше времени, чем завершение, по сравнению с отдельными запросами, которые я делал раньше. (Кстати, в подзапросе SELECT layerID etc по-прежнему используется индекс).

Я определил, использует ли он запрос или нет, используя оператор «EXPLAIN».

У меня есть отдельные индексы в ownerID и collectionID столбцов в таблице layers, и на layerID колонке в drawings таблице.

Что я делаю неправильно с моим запросом?

ответ

5

Попробуйте присоединиться. ЛЮБОЙ конец выглядит очень похоже на unoptimizable UNION для оптимизатора запросов.

SELECT d.DATA, d.layerID 
FROM drawings AS d 
INNER JOIN layers AS l ON d.layerID = l.layerID 
WHERE l.ownerID = ? AND l.collectionID = ? 
+0

Это сделало это, спасибо. Я постараюсь избежать использования подзапросов и вместо этого практиковать больше с объединениями. Просто мне легче понять подзапросы. – davr 2008-11-13 21:21:19

0

Я никогда не видел любое ключевое слово раньше, но если вы попытаетесь

 
SELECT DATA , layerID 
FROM drawings 
WHERE layerID IN (
    SELECT layerID 
    FROM layers 
    WHERE ownerID = ? 
    AND collectionID = ? 
) 

воли, которые имеют такую ​​же проблему? Я считаю, что этого не должно быть. Тем не менее, INNER JOIN, вероятно, немного лучше.

+0

Я верю, что «= ЛЮБОЙ» и «В» делают то же самое в большинстве случаев. – davr 2008-11-14 08:07:05

 Смежные вопросы

  • Нет связанных вопросов^_^