mrhard
@mrhard
web разработчик

Почему MySQL ORDER BY тормозит запрос и как это лечится?

Есть таблица. В таблице 300K записей.

CREATE TABLE `items` (
  `id_item` int(11) NOT NULL AUTO_INCREMENT,
  `id_user` int(11) DEFAULT NULL,
  `time_insert` int(11) DEFAULT NULL,
  `time_sort` int(11) DEFAULT NULL,
  `time_update` int(11) DEFAULT NULL,
  `time_stop` int(11) DEFAULT NULL,
  `time_remove` int(11) DEFAULT '0',
  `title` varchar(255) DEFAULT NULL,
  `des` text,
  `img` varchar(255) DEFAULT NULL,
  
  PRIMARY KEY (`id_item`),
  KEY `time_sort` (`time_sort`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


Делаем запрос:

SELECT * FROM `items` ORDER BY `id_item` DESC

Запрос выполняется меньше чем за секунду

SELECT * FROM `items` ORDER BY `time_sort` DESC

Запрос выполняется около 20-ти секунд.

Как ускорить запрос?
  • Вопрос задан
  • 1436 просмотров
Пригласить эксперта
Ответы на вопрос 4
@maxtm
Make money, not job
Вообще, обратная сортировка всегда тяжелая задача для БД, даже если у Вас есть праймари индекс. При такой сортировке он не используется, поэтому данные читаются с диска каждый раз.
Хотя в MySQL есть DESC индекс, но по факту - он до сих пор не имплементирован (реализован), хоть и не вызывает синтаксическую ошибку при создании такого индекса.

Есть хак как сделать обратную сортировку равную по скорости ASC сортировке - сделать доп. ячейку в которой хранить обратное значение (с минусом) и делать ASC сортировку.

То есть, допустим есть поле time_sort 15000, добавляете time_sort_desc со значением -15000.
И уже делаете ASC сортировку - результат будет такой же как и ASC сортировка по полю time_sort
Ответ написан
Комментировать
@kryvel
Системный администратор
А какие у Вас созданы индексы?
Ответ написан
@proger_rr
попробуй перевести из InnoDB в MyISAM будет быстрее
Ответ написан
un1t
@un1t
Потому что в первом случае у тебя есть индекс, а во втором нет.
Создай индекс по полю time_sort.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы