Какой смысл фильтровать в MySQL объяснить?

21

Как описано здесь в документации по MySQL :

Отфильтрованный столбец показывает приблизительный процент строк таблицы, которые будут отфильтрованы по условию таблицы. То есть, строки показывают приблизительное количество проверенных строк, а строки × отфильтрованные / 100 показывают количество строк, которые будут объединены с предыдущими таблицами. До MySQL 5.7.3 этот столбец отображается, если вы используете EXPLAIN EXTENDED. Начиная с MySQL 5.7.3 расширенный вывод включен по умолчанию, и ключевое слово EXTENDED не требуется.

Я до сих пор не понимаю. Что означает «фильтрованный» здесь? Какую информацию мы можем получить из этой колонки?

Например, когда я начинаю запрашивать, некоторые запросы показывают 100, а другие показывают 18 или меньше 100.

+-------------+-------+--------+---------+---------+------+----------+
| select_type | table | type   | key     | key_len | rows | filtered |
+-------------+-------+--------+---------+---------+------+----------+
| PRIMARY     | a     | range  | search  | 4       |  174 |   18.00  | <--
| PRIMARY     | b     | eq_ref | PRIMARY | 4       |    1 |   100.00 |
| PRIMARY     | c     | ALL    | PRIMARY | 4       |    1 |   100.00 |

Какой главный пункт мы можем сделать из этого значения?

Это говорит о том, что колонка отфильтрована только на 18%? Или, чем ниже оценка, тем лучше индекс / запрос?

Я использую MySQL 5.7

Иман Туморанг
источник

Ответы:

30

Фильтровать здесь означает применить условие к набору строк, которые были выбраны type-search в качестве потенциальных строк, и сохранить только те строки, которые удовлетворяют условию:

MySQL сначала попытается использовать индекс, например, выполнить rangeсканирование таблицы aс помощью searchклавиши -key. По его оценкам, 174 строки не могут использовать этот индекс, то есть число в rows. Этот шаг еще не называется фильтрацией.

После этого эти 174 строки должны быть проверены на соответствие дополнительным условиям (обычно в вашем where-clause). По оценкам MySQL, после применения этого фильтра останется только 32 строки, поэтому 18% из этих 174 строк останутся. Это 18% это значение в filtered.

Хотя, очевидно, лучше иметь 32 строки вместо 174 (если, например, вам придется join их с другой таблицей), «идеальный» индекс дал бы вам эти 32 строки непосредственно из первоначального поиска, что сэкономило бы вам время на просмотр. и отфильтровать 82% всех потенциальных строк.

Таким образом, низкое значение может указывать на то, что может быть лучший индекс: например, полное сканирование таблицы с rows=1000и filtered=0.1%может стать поиском по индексу, rows=1и filtered=100%если вы добавите хороший индекс.

С другой стороны, вы вполне можете полностью игнорировать это filtered-значение (которое в большинстве случаев является действительно неверной оценкой) и сосредоточиться на других более важных столбцах (особенно type, keyи extra) для оптимизации вашего запроса. Например, может быть лучше избавиться от filesort(например, с помощью индекса, который удовлетворяет order by), даже если это приводит к более низкому filteredзначению. А улучшение typeможет привести к значительному улучшению производительности, даже если оно не меняется или даже снижается filtered. В приведенном выше примере filtered=0.1%, type=allбыло бы уже достаточно , чтобы показать , что вы могли бы быть в состоянии улучшить этот запрос путем добавления индекса, не глядя filteredвообще.

Поэтому не принимайте это значение слишком серьезно: это не 100означает, что ваши индексы хороши, и более низкое значение не обязательно указывает на плохие индексы. typeэто гораздо лучший показатель для этого.

Солнечная вспышка
источник
1
Спасибо за объяснение. Это многое объясняет для меня. Я думаю, что это полезно для поддержания и выбора хорошего индекса
Иман Туморанг
@ ImanTumorang Я добавил замечание и примеры по этому поводу: не принимайте это значение слишком серьезно. Вы можете оптимизировать запрос, просто глядя на typeи extra(что является искусством само по себе); Вы могли бы жить без filtered, но не без type.
Солнечная вспышка
Тогда ладно. Я понял. Я уже читал это в Mysql Docs, как они влияют на производительность. Спасибо за ваше объяснение: D
Иман Туморанг
Другой совет: отфильтрованные вычисления пропускаются для последней таблицы, к которой они присоединились. то есть он покажет 100%, даже если на самом деле существуют условия, которые отфильтровывают некоторые из исследованных строк. Обоснование состоит в том, что для оценки коэффициента фильтрации стоит нечто, и это не повлияет на план выполнения запроса, если он находится в последней таблице, поэтому по умолчанию они пропускают вычисления.
Билл Карвин