#php #mysql
#php #mysql
Вопрос:
У меня есть запрос
select field from table order by field asc limit 4000, 30;
Таблица имеет миллион строк order by при таком простом выборе, что приводит к большим задержкам. В поле есть индекс.
Как избавиться от ‘order by’ и ускорить ограничение и получить тот же результат с помощью select?
Мое предложение состоит в том, чтобы изменить порядок строк, а затем просто упростить select field from table
. Не могли бы вы предложить идею получше?
Комментарии:
1. Сработает ли использование системы индексов?
2. Вы делаете заказ по разным полям? Или вы просто хотите каждый раз заказывать по одному и тому же полю?
3. Не могли бы вы добавить
int
столбецorder
и попробовать сортировать по нему?4. @Newbie1: итак, вам нужно выбрать все миллионы строк? Для чего?
5. Есть ли необходимость отображать все результаты по миллиону строк? Вы можете добавить ОГРАНИЧЕНИЕ для вашего запроса, чтобы ускорить запрос и отображение, если нет необходимости отображать все результаты.
Ответ №1:
Тип данных поля влияет на то, насколько быстрым будет order by. Целочисленные столбцы, как правило, быстрее всего для этого, а текстовые столбцы — медленнее всего. Если тип данных столбца, по которому вы сортируете, текстовый, я бы предложил вместо этого использовать числовой столбец для упорядочивания.
Индексирование столбца, по которому вы упорядочиваете, должно повысить производительность, но MySQL может проигнорировать это и выполнить полное сканирование таблицы. ПРИНУДИТЕЛЬНЫЙ ИНДЕКС может быть полезен для ускорения сортировки.
Изменение физического порядка столбцов в таблице не будет иметь предсказуемого эффекта, поскольку порядок строк по умолчанию не определен ни в MySQL, ни в какой другой базе данных SQL, о которой я знаю. По мере добавления, изменения и удаления строк физическое положение строки в таблице со временем будет меняться, поэтому вы не сможете зависеть от нее при упорядочении.
http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization в / есть несколько полезных советов по оптимизации сортировки.
Комментарии:
1. Хорошая статья, но не помогла решить мою проблему. Я не могу использовать between, на integer уже есть индекс. Является ли кэш одним-единственным решением?