MySQL Объясните - что это значит: отфильтровано 100,0, но строк мало - PullRequest
0 голосов
/ 09 марта 2020

Меня зовут Pascal, и у меня есть вопрос о функции EXPLAIN в MYSQL

У меня есть таблица Logs_activeusers (id, ifuser, dateLog)

У меня есть индекс on dateLog (timestamp) ... В этом запросе:

explain SELECT * FROM `logs_activeusers` WHERE datelog>1583703429

Таблица объяснения показывает мне это: columns = 10412 отфильтрованный = 100.0

Означает ли это, что запрос проходит по всем строкам ? Потому что у меня 2 миллиона строк .. Так почему фильтруется 100,0, а строк только 10412?

У меня с запросом все в порядке?

Потому что я не хочу, чтобы запрос просматривал все строки. .

Большое спасибо!

Pascal

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

строк относится к числу строк проверенных , другими словами, сколько строк нужно прочитать после сужения поиска с использованием индексов.

отфильтрованный - это процент проверенных строк, которые в конечном итоге удовлетворяют условиям предложения WHERE. Возможно, у вас есть запрос, который применяет дополнительные условия к проверенным строкам без помощи индекса. Неиндексированные условия оцениваются построчно в каждой проверяемой строке.

Пример:

SELECT * FROM `logs_activeusers` WHERE datelog>1583703429 AND user = 123

Теперь предположим, что для этого запроса используется индекс по datelog, но это единственный столбец этого индекса. Конечно, подмножество проверенных строк также соответствует другому условию user. Он будет проверять 10412 строк, проверяя каждую строку по очереди, снова проверяя условие на user, и отбрасывая те, которые не соответствуют.

Filter = 100.0 не обязательно плохо - это просто означает, что все проверенные строки соответствуют условиям запроса.

1 голос
/ 09 марта 2020

Ознакомьтесь с документацией здесь: https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain_filtered

Значение 'lines' - это количество строк, выводимых после вашего запроса. Если у вас есть строки = 10412, после выполнения запроса у вас будет столько строк, которые удовлетворяют вашему вызову SELECT.

Значение 'filter' представляет процент от выборки, которую MySQL просматривает и возвращает. Вы можете взглянуть более подробно здесь: https://dba.stackexchange.com/questions/164251/what-is-the-meaning-of-filtered-in-mysql-explain В основном MySQL дает вам оценку того, насколько эффективен ваш запрос на основе предположений, которые механизм делает с использованием индексов. Вы не должны слишком основываться на этом значении.

...