Mysql
 sql >> Database >  >> RDS >> Mysql

l'elaborazione di un numero elevato di voci di database con il paging rallenta nel tempo

Ecco cosa ho fatto e ho ridotto il tempo di esecuzione totale di un fattore 10.

Quello che ho capito dal piano di esecuzione della mia query originale era che stava usando filesort per ordinare tutti i risultati e ignorare gli indici. È un po' uno spreco.

Il mio database di prova:5 milioni di record, dimensioni 20 GB. struttura della tabella come nella domanda

Invece di ottenere blobCol direttamente nella prima query, ottengo prima il valore di 'name' per l'inizio di ogni pagina. Esegui questa query a tempo indeterminato finché non restituisce 0 risultati. Ogni volta, aggiungi il risultato a un elenco

SELECT name
FROM my_table
where id = <anyId> // I use the id column for partitioning so I need this here
order by name
limit <pageSize * pageNumber>, 1

Il numero di pagina sinusoidale non è noto in precedenza, inizia con il valore 0 e continua a incrementare fino a quando la query non restituisce null. Puoi anche eseguire un conteggio selezionato (*), ma ciò potrebbe richiedere molto tempo e non aiuterà a ottimizzare nulla. Ogni query ha richiesto circa 2 secondi per essere eseguita una volta che il numero di pagina ha superato ~60.

Per me, la dimensione della pagina era 5000, quindi ho ottenuto un elenco di stringhe "nome" nella posizione 0, 5001, 10001, 15001 e così via. Il numero di pagine risulta essere 1000 e memorizzare un elenco di 1000 risultati in memoria non è costoso.

Ora, scorrere l'elenco ed eseguire questa query

SELECT blobCol
FROM my_table
where name >= <pageHeader>
and name < <nextPageHeader>
and city="<any string>"
and id= 1

Questo verrà eseguito N volte, dove N =dimensione della lista ottenuta in precedenza. Poiché 'nome' è la chiave primaria col e 'città' è anche indicizzata, EXPLAIN mostra che questo calcolo viene eseguito in memoria utilizzando l'indice.

Ora, ogni query impiega 1 secondo per essere eseguita, invece dell'originale 30-40. Quindi, combinando il tempo di pre-elaborazione di 2 secondi per pagina, il tempo totale per pagina è di 3-4 secondi invece di 30-40.

Se qualcuno ha una soluzione migliore o se c'è qualcosa di palesemente sbagliato in questa, per favore fatemelo sapere