Arris
@Arris
Сапиенсы учатся, играя.

SELECT LIMIT OFFSET vs SELECT foo WHERE bar in () — что быстрее?

Дана таблица 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?

К сожалению, доступа к реальной базе у меня нет и приходится гадать на кофейной гуще.
  • Вопрос задан
  • 634 просмотра
Решения вопроса 1
Akdmeh
@Akdmeh
PHP, Yii2, Music
Да, второй способ может помочь, но только при условии, что первый запрос будет кешироваться.
Так действительно будет быстрее, ведь выборка идет по первичному ключу без дополнительных условий, которые требуют перебора, а затем - сортировки и частичной выборки с помощью LIMIT/OFFSET
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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