Rapido recupero della pagina in MySQL, utilizzo dell'indice?
-
03-07-2019 - |
Domanda
Vorrei velocizzare una query MySQL che sostanzialmente recupera una pagina di dati seguendo lo schema seguente
select
my_field_A,
my_field_B
where
time_id >= UNIX_TIMESTAMP('1901-01-01 00:00:00') AND
time_id < UNIX_TIMESTAMP('2009-01-16 00:00:00')
Il campo time_id
è un indice MySQL, tuttavia la query si comporta come se l'intero database fosse letto ad ogni query (il recupero di un paio di righe è già piuttosto lento). Non sono un esperto di MySQL. Qualcuno può indovinare cosa sto facendo di sbagliato?
Soluzione
Assicurati di avere un indice (B-tree) su time_id, questo dovrebbe essere efficiente per le query sugli intervalli. Assicurati anche che time_id sia nel formato orario appropriato.
Se vuoi davvero capire cosa sta facendo mysql, puoi aggiungere la parola chiave 'spiegazione' davanti alla query ed eseguirla nel tuo client mysql. Questo mostrerà alcune informazioni su cosa sta facendo mysql e che tipo di scansioni vengono eseguite.
Altri suggerimenti
Poiché probabilmente ci sono molti time_id
che rientrano in questi criteri, MySQL
potrebbe pensare che la scansione della tabella completa sia migliore.
Prova a forzare l'indice:
SELECT
my_field_A,
my_field_B
FROM mytable FORCE INDEX (index_name_on_time_id)
WHERE
time_id >= UNIX_TIMESTAMP('1901-01-01 00:00:00') AND
time_id < UNIX_TIMESTAMP('2009-01-16 00:00:00')
Hai bisogno della gamma inferiore? Ci sono voci precedenti al 1901? Come viene generata la colonna time_id? Se il time_id è sempre maggiore con ogni nuova voce aggiunta nel DB, potresti prendere in considerazione la ricerca dell'ID con la voce più vicina al 16/01/2009 e quindi selezionare per ID
select my_field_A, my_field_B
FROM
mytable
WHERE
id <= ?
In caso contrario, prova a verificare il partizionamento disponibile da MySQL 5.1 e abbattere la tabella per anni, ciò dovrebbe aumentare drasticamente la velocità.