Избегайте полного сканирования таблицы в mysql при использовании order by с ограничением - PullRequest
3 голосов
/ 18 января 2012

Я пишу запрос:

select * from table_name order by id limit 21

До тех пор, пока я использую ограничение, оно меньше или равно 20, то количество сканируемых строк равно точному количеству выбранных строк (например, если ограничение равно 10, то у отсканированных строк также только 10). Если предел превышает 20, таблица сканируется полностью.

Единственный индекс, созданный только для идентификатора первичного ключа. Кто-нибудь может сказать причину полного сканирования таблицы в этом случае?


В моей таблице 1099 строк.

Explain Result:
---------------------------------------------------------------------------
id|selecttype|table |type|possiblekeys|keys|key_len|ref |rows|  Extra       
---------------------------------------------------------------------------
1 | SIMPLE   |tablen|ALL |  null      |null|null   |null|1099|Usingfilesort 
---------------------------------------------------------------------------

1 Ответ

3 голосов
/ 21 января 2012

В общем случае, чтобы вернуть строки для LIMIT M, N MySQL должен будет сканировать M + N строк результата без LIMIT и пропустить первые M-1 из них, следовательно, полное сканирование таблицы.

Первые 20 строк в вашем случае, похоже, помещаются на одной странице, и, поскольку вы упорядочиваете по первичному ключу, MySQL, вероятно, понимает, что не нужно будет выполнять полное сканирование таблицы.

Еще одна вещь, которую следует знать, MySQL обычно не использует индексы для запросов, таких как SELECT * FROM T ORDER BY something, индексы обычно используются, когда есть условие, или если все данные могут быть получены из индекса напрямую (покрывая индексы).

...