Я выполнил запрос в Mysql, как показано ниже:
EXPLAIN
SELECT *
FROM(
SELECT * # Select Number 2
FROM post
WHERE parentid = 13
ORDER BY time, id
LIMIT 1, 10
) post13_childs
JOIN post post13_childs_childs
ON post13_childs_childs.parentid = post13_childs.id
и результат:
id |select_type |table |type |possible_keys |key |key_len |ref |rows |Extra
1 |PRIMARY |<derived2> |ALL | NULL | NULL |NULL |NULL |10 |
1 |PRIMARY |post13_childs_childs|ref |parentid |parentid |9 |post13_childs.id |10 |Using where
2 |DERIVED |post |ALL |parentid |parentid |9 | |153153 |Using where; Using filesort
Это означает, что он использовал индекс parentid
, но отсканировал все строки из-за ALL
и 153153
.
Почему индекс не мог помочь Full Scannig
?
Хотя, если я запускаю производный запрос (выберите # 2) один, как показано ниже:
Explain
SELECT * FROM post
WHERE parentid=13
ORDER BY time , id
LIMIT 1,10
желаемый результат:
id |select_type |table |type |possible_keys |key |key_len |ref |rows |Extra
1 |SIMPLE |post |ref |parentid |parentid |9 |const|41 |Using where; Using filesort
Edit:
В таблице post
указаны следующие индексы:
- id (PRIMARY)
- ParentId
- время, id (timeid)
кол-во итоговых строк → 141280.
количество детей 13
(parentid=13
) → 41
количество детей 11523
→ 10119
Когда я добавляю индекс (parent,time,id)
, проблема первого запроса будет решена с помощью вывода explin для 13
→ 40 строк, введите: ref
и для 11523
→ 19538 строк, тип: ref!!! это означает, что все дочерние строки 11423
проверяются, когда я ограничил первые 10 строк.