2009-04-12 10 views
6

avere un enorme tavolo mysql con il simile 300.000 dischi e volevano la pagina dei record in PHP (non il punto qui, però) con una query in questo modo:MySQL problemi di grande prestazioni tavolo quando il paging con PHP

SELECT * FROM `table` LIMIT 250000, 100 

Potrebbe essere molto più lento nell'ultima parte dei record, specialmente quando si avvicina la fine della tabella (LIMIT inizia molto grande). La mia ipotesi è che MySQL debba contare fino a esattamente 250000 prima di ottenere i risultati?

Quindi, come aggirare questo o qualsiasi altro approccio per il paging che potrebbe essere molto più veloce? Grazie!

risposta

4

Assicurati di utilizzare un indice altrimenti eseguirà una scansione completa della tabella. È possibile esaminare il piano di esecuzione per verificarlo o forzare il problema utilizzando una clausola ORDER BY (su una colonna indicizzata). Ecco more information.

La tabella non è così grande a 300k righe. Tuttavia, ci sono problemi di prestazioni con l'avvicinarsi della fine del tavolo. L'unica vera soluzione per questo è fingere la clausola limite. Avere un campo di incremento automatico che conta le righe da 1 a 300.000 e poi fare:

SELECT * 
FROM mytable 
WHERE field BETWEEN 250000 and 250100 

o simili. Ciò potrebbe essere problematico o impossibile se si eliminano frequentemente le righe, ma io tendo a rilevare che i dati meno recenti tendono a cambiare meno in modo da ottimizzarlo utilizzando LIMIT per le prime 100.000 righe e la colonna di paging surrogata oltre quella.

0

Questa è davvero l'intera query oppure esiste anche una clausola ORDER BY? Perché ciò rallenterà le query in modo grave. Dovresti aiutare se riesci a ottenere un indice sull'insieme completo di cose che stai ordinando, però.

+0

Si prega di inviare i messaggi come questo come un commento, non una risposta. Questa non è una risposta. – Will

1

Si è corretto: MySQL deve eseguire la scansione di 250000 righe inutili prima di leggere quelle desiderate. Non c'è davvero alcuna soluzione per questo Salva dividere una tabella in quelle più o avere un hack come ad esempio:

SELECT * FROM table WHERE id BETWEEN 250000 AND 250000 + 100 - 1 
;or 
SELECT * FROM table WHERE id > 250000 ORDER BY id ASC LIMIT 100 

Ma questo ancora non emula con precisione la funzione del LIMIT operatore a query complesse. È una velocità: costo opportunità opportunità.

0

Se si dispone di un campo AutoIncrement, si può solo fare:

SELECT * FROM table 
WHERE ID > @LastID 
ORDER BY ID 
LIMIT 100 
+0

Supponendo che i dati non siano mai stati rimossi, ovvero. – ceejayoz

Problemi correlati