Я играл (из интереса )с получением дерева узлов в простом списке смежности с помощью рекурсивного запроса с использованием локальных переменных.
Решение, которое у меня есть до сих пор, забавно, но мне интересно (, и это мой единственный вопрос ), почему 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
. Обратите внимание, что причина не может быть в небольшом наборе данных, потому что поведение не меняется, когда я указываю 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
в данном случае.