Почему MySQL не использует индекс для этого подзапроса? - PullRequest
0 голосов
/ 13 ноября 2008

Раньше я делал это:

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

Что даст мне массив layerID's, а затем я зациклюсь и сделаю это для каждого из них:

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.

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

Ответы [ 2 ]

5 голосов
/ 13 ноября 2008

Попробуйте присоединиться. ЛЮБОЙ в конечном итоге выглядит как неоптимизируемый 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 голосов
/ 14 ноября 2008

Я никогда раньше не видел ЛЮБОГО ключевого слова, но если вы попробуете

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

будет ли у вас такая же проблема? Я считаю, что это не должно. Тем не менее, ВНУТРЕННЕЕ СОЕДИНЕНИЕ, вероятно, немного лучше.

...