Per la Successiva e Prec pulsanti è possibile utilizzare una clausola WHERE
invece di OFFSET
.
Esempio (usando LIMIT 10
- i dati del campione ha spiegato di seguito): Siete sulla qualche pagina che mostra 10 file con gli ID [2522,2520,2514,2513,2509,2508,2506,2504,2497,2496]
. Questo nel mio caso viene creato con
select *
from link l
order by l.id desc
limit 10
offset 999000
Per la pagina successiva si usa
limit 10
offset 999010
ottenere file con ID [2495,2494,2493,2492,2491,2487,2483,2481,2479,2475]
.
Per la pagina precedente usereste
limit 10
offset 998990
ottenere righe con ids [2542,2541,2540,2538,2535,2533,2530,2527,2525,2524]
.
Tutte le query precedenti vengono eseguite in 500 msec. Usando il "trucco" suggerito da Sanj ci vuole ancora 250 msec.
Ora, con l'determinata pagina con minId=2496
e maxId=2522
possiamo creare le query per le Successiva e Ultimi pulsanti utilizzando la clausola WHERE
.
pulsante Avanti:
select *
from link l
where l.id < :minId -- =2496
order by l.id desc
limit 10
ids risultante: [2495,2494,2493,2492,2491,2487,2483,2481,2479,2475]
.
pulsante Indietro:
select *
from link l
where l.id > :maxId -- =2522
order by l.id asc
limit 10
ids risultante: [2524,2525,2527,2530,2533,2535,2538,2540,2541,2542]
.
per invertire l'ordine è possibile utilizzare la query in un sub-SELECT:
select *
from (
select *
from link l
where l.id > 2522
order by l.id asc
limit 10
) sub
order by id desc
risultanti ids: [2542,2541,2540,2538,2535,2533,2530,2527,2525,2524]
.
Queste query vengono eseguite in "nessun tempo" (meno di 1 msec) e forniscono lo stesso risultato.
Non è possibile utilizzare questa soluzione per creare numeri di pagina. Ma non penso che produrrai numeri di pagina di 200K.
dati di test:
dati utilizzati per l'esempio e parametri di riferimento è stato realizzato con
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
dove test._dummy_indexes_2p23
è una tabella contenente 2^23 ids (circa 8M). Quindi i dati contengono circa 1 milione di righe che a caso mancano ogni secondo id. Dimensioni della tavola: 228 MB
Avete bisogno di tutte le colonne della tabella Puoi approfondire slowness- Quanto tempo sta prendendo? Inoltre, qual è il tipo di dati delle colonne? – Sanj
si può eseguire sotto query e incollare il risultato 'SPIEGARE SELECT * FROM collegamento LIMIT 999999, 50;' –
suoi quasi prendere 1 secondo, ma quando nessuno di fila sarà più grande allora il tempo andare a prendere il tempo sarà più SELECT * DA link LIMIT 1, 50; sta prendendo .9ms ma lo sql corrente sta prendendo 1000ms la sua 100 volta che prende più. –