2009-03-23 13 views
5

Attualmente sto eseguendo alcune query SELECT intensive su una tabella MyISAM. Il tavolo è di circa 100 MiB (800.000 file) e non cambia mai.Alternative al motore di memorizzazione MEMORY per MySQL

Ho bisogno di aumentare le prestazioni del mio script, quindi stavo pensando di spostare il tavolo da MyISAM al motore di archiviazione MEMORY, così ho potuto caricarlo completamente nella memoria.

Oltre al motore di memorizzazione MEMORY, quali sono le opzioni per caricare una tabella 100 MiB nella memoria?

+0

per favore lancia un 'SHOW CREATE TABLE' sulla tua tabella e pubblica il risultato in modo che possiamo vedere la struttura della tabella e gli indici . Alcune query SELECT di esempio dovrebbero essere anche grandiose. –

+0

http://dba.stackexchange.com/questions/1811/what-are-reasons-not-to-use-the-memory-storage-engine-in-mysql – zloctb

risposta

4

Una tabella con 800k righe non dovrebbe essere un problema per mysql, indipendentemente dal motore di archiviazione che si sta utilizzando. Con una dimensione di 100 MB, la tabella completa (dati e chiavi) deve essere conservata in memoria (cache delle chiavi di mysql, cache dei file del sistema operativo o in entrambi i casi).

Prima si controlla gli indici. Nella maggior parte dei casi, l'ottimizzazione degli indici offre il miglior incremento delle prestazioni. Non fare mai altro, a meno che tu non sia sicuro che siano in forma. Richiama le query utilizzando EXPLAIN e osserva i casi in cui non viene utilizzato alcun indice o errato.Questo dovrebbe essere fatto con dati del mondo reale e non su un server con dati di test.

Dopo aver ottimizzato gli indici, le query dovrebbero terminare di una frazione di secondo. Se le query sono ancora troppo lente, prova solo ad evitare di eseguirle usando una cache nella tua applicazione (memcached, ecc.). Dato che i dati nella tabella non cambiano mai non dovrebbero esserci problemi con i vecchi dati della cache ecc.

0

Supponendo che i dati cambino raramente, è possibile aumentare significativamente le prestazioni delle query utilizzando .

+1

Stavo cercando memcache e altre soluzioni cache, ma il problema con le query nella cache è che raramente sono le stesse query. La maggior parte delle volte è una query diversa che verrà chiamata solo una volta. –

0

Se la tua tabella viene interrogata molto probabilmente è già presente nella cache a livello di sistema operativo, a seconda della quantità di memoria presente nel tuo server.

MyISAM consente anche il precaricamento di indici di tabelle MyISAM in memoria utilizzando un meccanismo denominato MyISAM Key Cache. Dopo aver creato una cache della chiave, è possibile caricare un indice nella cache utilizzando la sintassi CACHE INDEX o LOAD INDEX.

Suppongo che tu abbia analizzato la tabella e le query e ottimizzato gli indici dopo le query effettive? Altrimenti è davvero qualcosa che dovresti fare prima di tentare di memorizzare l'intero tavolo in memoria.

+0

Ho già ottimizzato la tabella e le mie query. La mia struttura della tabella è qualcosa di simile a questo: id età nome cognome sesso numero civico Città Stato ... E la maggior parte delle mie domande simile a questa: SELECT FROM tabella 'parametro di ricerca' WHERE nome della colonna = –

0

Se si dispone di memoria sufficiente allocata per l'utilizzo di Mysql - nel pool di buffer Innodb o per l'utilizzo da MyIsam, è possibile leggere il database in memoria (solo un 'SELECT * da tablename') e se non c'è motivo di rimuovere esso, rimane lì.

È anche possibile utilizzare la chiave in modo migliore, poiché la tabella MEMORY esegue solo chiavi hash-bash, piuttosto che un accesso completo a barre, che per le chiavi più piccole e non univoche potrebbe essere sufficiente per i grassi, oppure non tanto con una tabella così grande .

Come al solito, la cosa migliore è farlo per confrontarlo.

Un'altra idea è, se si utilizza v5.1, utilizzare un tipo di tabella ARCHIVE, che può essere compresso, e può anche velocizzare l'accesso ai contenuti, se sono facilmente comprimibili. Scambia il tempo della CPU per decomprimere per l'accesso IO/memoria.

0

Se i dati non cambiano, è possibile duplicare facilmente la tabella su diversi server di database.

In questo modo è possibile scaricare alcune query su un server diverso, ottenendo un po 'di respiro extra per il server principale.

Il miglioramento della velocità dipende dal carico del database corrente, non ci sarà alcun miglioramento se il carico del database è molto basso.

PS:
Si sa che le tabelle MEMORY dimenticano il loro contenuto al riavvio del database!

Problemi correlati