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?

È stato utile?

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.

http://dev.mysql.com/doc /refman/5.0/en/using-explain.html

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à.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top