Дана таблица MySQL примерно следующей структуры:
id int,
data1 varchar(300), data2 varchar(300), data3 varchar(300)... dataN varchar(300),
factor1 int,
factor2 int,
factor3 varchar(30),
factor4 tinyint(4),
factor5 datatime
...
factorN sometype
Индекс по
id и
factor*.
Тип таблицы
MyISAM. Версия mysql-сервера
5.6.19-67.0-log.
В таблице десятки миллионов строк.
К ней периодически (достаточно часто) делается запрос вида:
SELECT * FROM table WHERE (совокупность факторов) LIMIT 100 OFFSET N
Конечно выбираются не все поля звездочкой, идет перечисление нужных, но миссия не в этом.
Пока OFFSET маленький - все хорошо.
Как только делают запрос вида
LIMIT 100 OFFSET 750000
ситуация портится.
Собственно это бэкэнд пагинации с отбором по нескольким критериям.
Долго я кумекал, как это можно закешировать да ускорить и докумекал до следующей идеи:
1. Сначала мы выбираем все возможные айдишники строк, удовлетворяющих нужным критериям:
SELECT id FROM table WHERE (совокупность критериев)
2. Потом последовательность айдишек разбиваем на цепочки по 100 чисел.
3. Цепочки (строки) кэшируем (с учетом таймштампов для проверки устаревания и совокупности факторов запроса).
4. Потом выбираем нужную нам цепочку айдишников
5. И дёргаем из базы нужные 100 строк таким запросом:
SELECT * FROM table WHERE id in (set)
Понятно, что шаги 1..3 выполняются, если на 4 шаге в кэше нет нужной нам последовательности (или она устарела).
В чем вопрос:
насколько SELECT FROM TABLE WHERE id in set быстрее/медленнее запроса
SELECT FROM TABLE LIMIT OFFSET?
К сожалению, доступа к реальной базе у меня нет и приходится гадать на кофейной гуще.