Con offset grandi, MySQL
deve cercare più record.
Anche se il piano utilizza filesort
(il che significa che tutti i record devono essere passati in rassegna), MySQL
ottimizza in modo che solo $offset + $limit
record superiori sono ordinati, che lo rende molto più efficiente per i valori più bassi di $offset
.
La soluzione tipica è per indicizzare le colonne che stai ordinando sul, registrare l'ultimo valore delle colonne e riutilizzarla nelle query successive, in questo modo:
SELECT *
FROM mytable
ORDER BY
value, id
LIMIT 0, 10
cui uscite:
value id
1 234
3 57
4 186
5 457
6 367
8 681
10 366
13 26
15 765
17 345 -- this is the last one
per arrivare alla pagina successiva, si può usare:
SELECT *
FROM mytable
WHERE (value, id) > (17, 345)
ORDER BY
value, id
LIMIT 0, 10
, che utilizza l'in dex su (value, id)
.
Naturalmente questo non è di aiuto con le pagine di accesso arbitrario, ma aiuta con la navigazione sequenziale.
Inoltre, MySQL
ha alcuni problemi con la ricerca della riga in ritardo. Se le colonne sono indicizzate, può essere la pena di provare a riscrivere la query come questa:
SELECT *
FROM (
SELECT id
FROM mytable
ORDER BY
value, id
LIMIT $offset, $limit
) q
JOIN mytable m
ON m.id = q.id
consulta questo articolo per spiegazioni più dettagliate:
Buona domanda, io sono non ha familiarità con il funzionamento di MySQL in questo senso. – RedFilter
Grazie per le risposte, lo testeremo più tardi nella speranza di guadagnare un po 'di velocità. – Omiod