EXPLAIN SELECT ...
объясняет порядок, в котором будет говориться таблицы (в JOIN
) и то, что индекс (ы), если таковые имеются, будет использоваться.
Rows
- приблизительное значение, которое исходит из статистических данных, собранных различными способами, но не очень точных. ANALYZE TABLE
- это способ сделать систему пересчитанной статистикой. Если у вас есть LIMIT
, то Rows
иногда зрелищно неправильно.
Если у вас есть UNIQUE(attr1, attr2)
, это может быть достаточно умно, чтобы сказать 1
за Rows
. Таблица с N значениями и статистикой, которые говорят, что различные значения для attr1 и B различных значений для attr2 - Rows
могут быть чем-то вроде A * B/N. Но, если Val1
и Val2
являются общими (или редкими) значениями, это вычисление может быть далеким.
В некоторых ситуациях, оптимизатор будет делать зонды в индекс, чтобы оценить, сколько строк Val1
и т.д. Так как это делается динамически (не статический, как и с некоторыми другими продуктами), то EXPLAIN
(и, следовательно, план запроса) могут отличаться в зависимости от значений. (Я видел целых 6 разных планов запросов для SELECT
, которые отличались только константами.)
EXPLAIN FORMAT=JSON SELECT ...
(в 5.6) дает более подробную информацию. «Трассировка оптимизатора» дает еще более подробную информацию.
attr1='Val1' and attr2='Val2'
хотел бы один из них, в порядке предпочтения:
INDEX(attr1, attr2, ...)
или INDEX(attr2, attr1, ...)
, если либо существует; это оптимально; или
INDEX(attr1, ...)
или INDEX(attr2, ...)
; он будет выбирать на основе селективности, или
- Сканирование таблицы, если ни один из индексов выше не существует, или если статистика говорит, что индексы не стоит использовать.
Если есть ORDER BY
, может произойти что-то еще.
Если индекс «охватывает» запрос, то EXPLAIN
говорит Using index
. Например, может использоваться INDEX(attr3, attr1, attr2)
, хотя весь индекс должен быть отсканирован - SELECT attr3 FROM t WHERE attr1='Val1' and attr2='Val2'
.
Если вы хотите обсудить конкретный запрос, представьте его. Все части запроса may влияет на то, что говорит EXPLAIN
.
Here - некоторые основные правила построения оптимальных индексов.
Основная причина, по которой я использовал «Объяснить» на mysql и/или Oracle, - это понять, насколько дорогой конкретный запрос и понять, как оптимизировать запрос. Основная рекомендация, которую я могу сделать, - это использовать Объяснение, чтобы определить, существует ли условие в предложении where, которое соответствует значению (столбцу), которое НЕ индексируется. Когда условие условия where должно проверять каждую строку таблицы (полное сканирование таблицы), запрос выполняет дополнительную работу. Если все условия в предложении where против индексированных значений, запрос вернется быстрее. – mba12