Für die Weiter und Zurück Tasten können Sie eine WHERE
Klausel statt OFFSET
verwenden.
Beispiel (mit LIMIT 10
- Beispieldaten siehe unten): Sie befinden sich auf einigen Seite sind, die Sie 10 Zeilen mit den ids [2522,2520,2514,2513,2509,2508,2506,2504,2497,2496]
zeigt. Dies ist in meinem Fall erstellt mit
select *
from link l
order by l.id desc
limit 10
offset 999000
Für die nächste Seite Sie
limit 10
offset 999010
immer Reihen mit ids [2495,2494,2493,2492,2491,2487,2483,2481,2479,2475]
verwenden würden.
Für die vorherige Seite würden Sie
limit 10
offset 998990
immer Reihen mit [2542,2541,2540,2538,2535,2533,2530,2527,2525,2524]
IDs verwenden.
Alle obigen Abfragen werden in 500 ms ausgeführt. Mit dem von Sanj vorgeschlagenen "Trick" dauert es noch 250 ms.
nun mit der angegebenen Seite mit minId=2496
und maxId=2522
können wir Anfragen für die und Letzte Tasten Als Nächstes erstellen Sie die WHERE
-Klausel.
Schaltfläche Weiter:
select *
from link l
where l.id < :minId -- =2496
order by l.id desc
limit 10
Resultierende ids: [2495,2494,2493,2492,2491,2487,2483,2481,2479,2475]
.
Zurück-Taste:
select *
from link l
where l.id > :maxId -- =2522
order by l.id asc
limit 10
Resultierende ids: [2524,2525,2527,2530,2533,2535,2538,2540,2541,2542]
.
die Reihenfolge umkehren möchten Sie die Abfrage in einem subselect verwenden können:
select *
from (
select *
from link l
where l.id > 2522
order by l.id asc
limit 10
) sub
order by id desc
Resultierende ids: [2542,2541,2540,2538,2535,2533,2530,2527,2525,2524]
.
Diese Abfragen werden in "keine Zeit" (weniger als 1 ms) ausgeführt und liefern das gleiche Ergebnis.
Sie können diese Lösung nicht zum Erstellen von Seitenzahlen verwenden. Aber ich glaube nicht, dass Sie 200K Seitenzahlen ausgeben werden.
Testdaten:
Daten für das Beispiel verwendet und Benchmarks wurden mit
erstellt 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
wo test._dummy_indexes_2p23
eine Tabelle enthält, ist 2^23-IDs (etwa 8 M). So enthalten die Daten etwa 1M Zeilen, die nach jeder zweiten ID zufällig fehlen. Tischgröße: 228 MB
Sie alles, was Sie die Spalten müssen aus der Tabelle können Sie auf slowness- erarbeiten, wie es lange dauert? Was ist der Datentyp der Spalten? – Sanj
können Sie unter Abfrage ausführen und das Ergebnis 'EXPLAIN SELECT * FROM Link LIMIT 999999, 50 einfügen;' –
seine fast nehmen Sie 1 sec aber, wenn keine der Reihe wird noch größer dann Zeit holen Zeit mehr SELECT * sein FROM Link LIMIT 1, 50; nimmt .9ms aber gegenwärtiges sql nimmt 1000ms seine 100 Zeit, die mehr nimmt. –