2016-04-14 2 views
0

Я пытаюсь понять вывод инструкции Describe.Mysql Описать оценку строки запроса

Рассмотрим запроса: Describe Select 1 from TableName where attr1='Val1' and attr2='Val2'

один из выходного Explained Here является «строками», который оценивает количество строк, которые будут доступны на выполнение запроса на выборку с тем же где п (attr1 = «val1» и attr2 = 'Val2'). Как это делается?

Благодаря

+0

Основная причина, по которой я использовал «Объяснить» на mysql и/или Oracle, - это понять, насколько дорогой конкретный запрос и понять, как оптимизировать запрос. Основная рекомендация, которую я могу сделать, - это использовать Объяснение, чтобы определить, существует ли условие в предложении where, которое соответствует значению (столбцу), которое НЕ индексируется. Когда условие условия where должно проверять каждую строку таблицы (полное сканирование таблицы), запрос выполняет дополнительную работу. Если все условия в предложении where против индексированных значений, запрос вернется быстрее. – mba12

ответ

1

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 - некоторые основные правила построения оптимальных индексов.

Смежные вопросы