MySQL ВЫБРАТЬ первые X строк без индекса - PullRequest
0 голосов
/ 30 марта 2020

Я ищу способ выполнить запрос SELECT для большой таблицы без добавления каких-либо новых индексов.

SELECT id FROM table_name WHERE column_1 = "" limit 100

около 800 000 из этих пустых строк и около 5 миллионов заполненных.

На мой взгляд, должен быть способ, при котором механизм базы данных просто начинает читать таблицу с одного конца, собирает первые 100 строк (независимо от порядка) и останавливается. Однако с помощью вышеуказанного запроса он проверяет все 5М строк.

Я искал inte rnet без ответа. Может ли кто-нибудь помочь мне. Спасибо.

Ответы [ 2 ]

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

«он проверяет все 5М строк» ​​- если вы используете EXPLAIN, чтобы сказать это, не доверяйте ему. EXPLAIN редко настраивает свой столбец «Rows» для учета LIMIT.

OTOH. Если бы только последние 100 строк были пустыми, прочитал бы все 5M строк. Если первые 100 строк не заполнены, будут прочитаны только 100 строк. Оптимизатор не достаточно умен, чтобы знать, что из этого произойдет.

С INDEX(column1) он коснется только 100 index строк и получит идентификаторы (которые находятся в BTree индекса. Если вы хотите больше, чем просто id, есть дополнительный шаг (выполненный 100 раз), чтобы добраться до BTree данных, чтобы получить остальные столбцы.

Если вы хотите обсудить далее, предоставьте SHOW CREATE TABLE; нам нужно увидеть движок, PRIMARY KEY, типы данных и т. Д. c.

Вы сначала выбираете 100 идентификаторов, а затем выбираете что-то на их основе? Это почти всегда менее эффективно, чем объединение два запроса.

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

Так или иначе, я бы добавил индекс в "column_1".

Я почти уверен, что MySQL не дает никакой возможности повлиять на это.

Вы можете попробовать выполнить хранимую процедуру, которая затем выбирает "SELECT id FROM table_name" фильтры на "column_1 =" "" и останавливаются после подсчета 100 положительных результатов.

Если есть какие-либо более эффективные методы, я буду рад услышать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...