Ответ 1
Для кнопок Next и Prev вы можете использовать предложение WHERE
вместо OFFSET
.
Пример (используя LIMIT 10
- Пример данных, приведенных ниже): Вы находитесь на одной странице, которая показывает вам 10 строк с идентификаторами [2522,2520,2514,2513,2509,2508,2506,2504,2497,2496]
. Это в моем случае создается с помощью
select *
from link l
order by l.id desc
limit 10
offset 999000
На следующей странице вы будете использовать
limit 10
offset 999010
получение строк с идентификаторами [2495,2494,2493,2492,2491,2487,2483,2481,2479,2475]
.
Для предыдущей страницы вы использовали бы
limit 10
offset 998990
получение строк с идентификаторами [2542,2541,2540,2538,2535,2533,2530,2527,2525,2524]
.
Все вышеперечисленные запросы выполняются через 500 мс. Используя "трюк", предложенный Sanj, он все равно занимает 250 мс.
Теперь с данной страницей с minId=2496
и maxId=2522
мы можем создавать запросы для кнопок Next и Last с помощью предложения WHERE
.
Следующая кнопка:
select *
from link l
where l.id < :minId -- =2496
order by l.id desc
limit 10
Результирующие идентификаторы: [2495,2494,2493,2492,2491,2487,2483,2481,2479,2475]
.
Кнопка Prev:
select *
from link l
where l.id > :maxId -- =2522
order by l.id asc
limit 10
Результирующие идентификаторы: [2524,2525,2527,2530,2533,2535,2538,2540,2541,2542]
.
Чтобы отменить порядок, вы можете использовать запрос в подзапросе:
select *
from (
select *
from link l
where l.id > 2522
order by l.id asc
limit 10
) sub
order by id desc
Результирующие идентификаторы: [2542,2541,2540,2538,2535,2533,2530,2527,2525,2524]
.
Эти запросы выполняются в режиме "нет времени" (менее 1 мс) и обеспечивают тот же результат.
Вы не можете использовать это решение для создания номеров страниц. Но я не думаю, что вы собираетесь выводить 200 тыс. Номеров страниц.
Данные теста:
Данные, используемые для примера и эталонных тестов, были созданы с помощью
CREATE TABLE `link` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`url` VARCHAR(255) NOT NULL,
`website` VARCHAR(100) NULL DEFAULT NULL,
`state` VARCHAR(10) NULL DEFAULT NULL,
`type` VARCHAR(100) NULL DEFAULT NULL,
`prio` VARCHAR(100) NULL DEFAULT NULL,
`change` VARCHAR(100) NULL DEFAULT NULL,
`last` VARCHAR(100) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `url` (`url`)
) COLLATE='utf8_general_ci' ENGINE=InnoDB;
insert into link
select i.id
, concat(id, '-', rand()) url
, rand() website
, rand() state
, rand() `type`
, rand() prio
, rand() `change`
, rand() `last`
from test._dummy_indexes_2p23 i
where i.id <= 2000000
and rand() < 0.5
где test._dummy_indexes_2p23
- таблица, содержащая 2 ^ 23 идентификаторов (около 8M). Таким образом, данные содержат около 1M строк, случайным образом пропускающих каждый второй id. Размер таблицы: 228 МБ