Mysql index не работает на более высоких лимитах - PullRequest
1 голос
/ 03 января 2012

У меня есть таблица, содержащая один первичный ключ. Когда я бегу

ОБЪЯСНИТЬ ВЫБРАТЬ * ИЗ НОВОСТЕЙ ЗАКАЗАТЬ ПО ИДЕНТИФИКАТОРУ ASC ПРЕДЕЛ 29

Mysql возвращает

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE           news    ALL      NULL           NULL    NULL      NULL     640     Using filesort

Но ОБЪЯСНИТЬ ВЫБРАТЬ * ИЗ новостей ЗАКАЗАТЬ ПО ID ASC LIMIT 28 возвращается

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE          news    index   NULL           PRIMARY  4          NULL     28   

ПОКАЗАТЬ ИНДЕКС ИЗ новостей;

Table, Non_unique, Key_name, Seq_in_index, Column_name, Collation, Cardinality, Sub_part, Packed, Null, Index_type, Comment  
'news', 0, 'PRIMARY', 1, 'id', 'A', 640, , '', '', 'BTREE', ''
'news', 1, 'tarix', 1, 'tarix', 'A', 106, , '', '', 'BTREE', ''
'news', 1, 'yayindil', 1, 'yayin', 'A', 3, , '', '', 'BTREE', ''
'news', 1, 'yayindil', 2, 'dil', 'A', 7, , '', '', 'BTREE', ''

Я проверил это на других таблицах, они отлично работают и на пределе 4000. Что не так? Почему только до 29 ограничений используют индексы?

1 Ответ

0 голосов
/ 03 января 2012

Оптимизатор пытается выбрать самый дешевый путь исполнения. Если в таблице всего 640 строк, не удивительно, что оптимизатор выбирает полное сканирование. Загрузите таблицу с 40000 строками, и вы обнаружите, что вам нужно увеличить предел (возможно, до 2000), прежде чем выбрать полное сканирование таблицы.

...