«он проверяет все 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 идентификаторов, а затем выбираете что-то на их основе? Это почти всегда менее эффективно, чем объединение два запроса.