Редактировать: префикс index - лучшее имя, чем частичный индекс, который я использовал.
Поскольку ваш индекс является частичным индексом, MySQL не может использовать его для заказа и все же должен сортировать значения по их полной длине.
Давайте попробуем этот небольшой пример:
create table o1 (a varchar(10));
insert into o1 values('test1'),('test2'),('test3'),('tes1');
create index oindex on o1 (a);
explain select a from o1 order by a;
MySQL использует индекс для заказа по.
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'o1', 'index', NULL, 'oindex', '103', NULL, '8', 'Using index'
Теперь, воссоздают частичный индекс:
drop index oindex on o1;
create index oindex on o1 (a (2));
explain select a from o1 order by a;
MySQL теперь пытается "FileSort".
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'o1', 'ALL', NULL, NULL, NULL, NULL, '8', 'Using filesort'
Для поиска, частичный индекс является полезным, поскольку MySQL может просто отбросить эти значения не полностью удовлетворяют заданному условию. Для ORDER BY MySQL может не иметь такой удачи. В приведенном выше случае даже я создаю «частичный индекс» для макс. длина столбца, MySQL все еще не использует индекс для ORDER BY.
Из-за 'предела'. Механизм базы данных должен пройти 150 000 строк. –
@GordonLinoff на самом деле ограничение 50000 – Ormoz
Я согласен, что 'LIMIT' также является частью замедления, но время, которое он принимает, смешно, особенно когда вы поднимаете смещение на что-то вроде' 500000' (которое увеличивает время до 30 секунд на запрос). Каковы некоторые решения для его ускорения? –