SELECT с переменными запроса без индексов

Я играл (из интереса )с получением дерева узлов в простом списке смежности с помощью рекурсивного запроса с использованием локальных переменных.

Решение, которое у меня есть до сих пор, забавно, но мне интересно (, и это мой единственный вопрос ), почему MySQL отказывается использовать INDEXдля оптимизации этого запроса. Разве MySQL не должен иметь возможность искать ближайший дочерний (s )с помощью INDEX?

Мне любопытно, почему MySQL этого не делает. Даже когда я использую FORCE INDEX, план выполнения не меняется.

Это запрос на данный момент, где 5является идентификатором родительского узла :

SELECT 
  @last_id := id AS id,
  parent_id,
  name,
  @depth := IF(parent_id = 5, 1, @depth + 1) AS depth
FROM 
  tree FORCE INDEX (index_parent_id, PRIMARY, index_both),
  (SELECT @last_id := 5, @depth := -1) vars
WHERE id = 5 OR parent_id = @last_id OR parent_id = 5

Try live example at SQLfiddle

. Обратите внимание, что причина не может быть в небольшом наборе данных, потому что поведение не меняется, когда я указываю FORCE INDEX (id), или FORCE INDEX (parent_id), или FORCE INDEX (id, parent_id)...

. Документы говорят:

You can also use FORCE INDEX, which acts like USE INDEX (index_list) but with the addition that a table scan is assumed to be very expensive. In other words, a table scan is used only if there is no way to use one of the given indexes to find rows in the table.

Должно быть что-то, из-за чего запрос не может использовать ИНДЕКС, но я не понимаю, что это такое.


Отказ от ответственности:Я знаю, что существуют разные способы хранения и извлечения иерархических данных в SQL. Я знаю о модели вложенных наборов. Я не ищу альтернативную реализацию. Я не ищу вложенные наборы.

Я также знаю, что запрос сам по себе является сумасшедшим и дает неверные результаты.

Я просто хочу понять (подробно ), почему MySQL не использует INDEXв данном случае.

6
задан Kaii 20 July 2012 в 19:50
поделиться