it-swarm.it

Memorizza nella cache il database MySQL

Sto riscontrando problemi con un sito Web con 600 MB di database MySQL. Il sito Web è troppo lento. Ho notato che più grande diventa il database MySQL, più lento va. Quando era di 5 MB, il sito Web era molto veloce. Quando ha iniziato a diventare più grande ha iniziato a diventare sempre più lento e ora, a 600 MB, è davvero lento, impiegando circa 10 secondi per caricare le pagine.

Ho controllato i processi principali e non ha nulla a che fare con il carico elevato o altro. Non è nemmeno correlato a IOPS come ho testato su unità HDD 7.2k rpm e ha dato lo stesso problema ora con i test con unità SSD Intel 320, quindi non penso che si tratti nemmeno di query elevate.

Il sito Web sta usando Wordpress e ci sono circa 9 plugin attivi. La gente ha detto che potrebbero essere i plugin ... beh forse ... ma in questo momento voglio solo mettere in cache l'intero database in memoria e vorrei ottenere aiuto e indicazioni su dove iniziare e come farlo.

Ho 16 GB RAM e i5-2400 4 core a 3,1 GHz. Il sistema operativo è centos 5,7

top - 07:23:57 up 9 days, 12:15, 0 users, load average: 0.09, 0.04, 0.05
Tasks: 162 total, 1 running, 161 sleeping, 0 stopped, 0 zombie
Cpu(s): 8.2%us, 1.0%sy, 0.0%ni, 90.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16367532k total, 3641628k used, 12725904k free, 612140k buffers
Swap: 1046520k total, 0k used, 1046520k free, 1538896k cached
11
grant tailor

Se fossi in te, cambierei tutti i dati su InnoDB. Il blocco delle tabelle/blocco delle righe è stato a lungo discusso da molti. Sceglierei sempre InnoDB a mani basse. Tuttavia, c'è un altro motivo profondo per scegliere InnoDB ... CACHING .

Mentre la maggior parte delle persone si vanta che MyISAM è più veloce per le letture, la maggior parte delle persone dimentica che molte cache per MyISAM, che è chiamata cache delle chiavi (impostata da key_buffer_size), memorizza nella cache solo le pagine dell'indice dai file .MYI. Non memorizza mai nella cache le pagine dei dati. Ha un massimo ufficiale di 4 GB nei sistemi a 32 bit. 8 GB è il massimo massimo per 64 bit.

Il pool di buffer InnoDB memorizza nella cache i dati e le pagine dell'indice. A seconda del server in uso, è possibile memorizzare nella cache l'intero set di dati nella RAM. È possibile ottimizzare InnoDB fino all'80% RAM e 10% per le convenzioni DB, e lasciare il 10% per il sistema operativo. Ciò vale anche per sistemi operativi diversi .

Ho raccomandato queste cose per Drupal clienti con un successo meraviglioso. Si applica a Wordpress altrettanto bene. Ho fornito supporto DB per i clienti con WordPress. Stessi miglioramenti.

Puoi sempre configurare la memoria per InnoDB in modo più efficace che puoi aggiungere più MyISAM. C'è sempre un modo per tweek InnoDB per soddisfare le tue esigenze prestazionali . Man mano che i tuoi dati crescono, alla fine diventerà un requisito .

AGGIORNAMENTO 2011-11-21 11:44 EST

Se il set di dati completo è abbastanza piccolo, puoi eseguire una query SELECT su ogni tabella che hai subito dopo l'avvio di mysql.

Per tutte le tabelle che sono InnoDB e/o MyISAM, eseguire questa query:

SELECT DISTINCT
    CONCAT('SELECT ',ndxcollist,' FROM ',
    db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
    SELECT
        engine,table_schema db,table_name tb,index_name,
        GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
    FROM (
        SELECT
            B.engine,A.table_schema,A.table_name,
            A.index_name,A.column_name,A.seq_in_index
        FROM
            information_schema.statistics A INNER JOIN
            (SELECT engine,table_schema,table_name
            FROM information_schema.tables
            WHERE engine IN ('InnoDB','MyISAM')) B
            USING (table_schema,table_name)
        WHERE
            B.table_schema NOT IN ('information_schema','mysql')
            AND A.index_type <> 'FULLTEXT'
        ORDER BY
            table_schema,table_name,index_name,seq_in_index
        ) A
    GROUP BY
        table_schema,table_name,index_name
) AA
ORDER BY
    engine DESC,db,tb
;

Ciò produrrà tutte le possibili query SELECT che è necessario eseguire che richiamerà tutti gli indici a cui fare riferimento. Inserire questa query in un file chiamato /root/MakeSelectQueriesToLoad.sql. Esegui lo script e raccogli l'output /root/SelectQueriesToLoad.sql. Infine, eseguilo:

mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql

Ciò precaricherà sicuramente tutte le pagine di indice nel pool di buffer InnoDB e nella cache delle chiavi MyISAM. Se tutti i tuoi dati sono InnoDB, apporta due modifiche:

  • sostituisci WHERE engine IN ('InnoDB','MyISAM') con WHERE engine='InnoDB'
  • sostituire CONCAT('SELECT ',ndxcollist,' FROM ', con CONCAT('SELECT * FROM ',

Questo popolerà anche più pagine di dati nel pool di buffer InnoDB.

NOTA FINALE: Assicurati che il pool di buffer InnoDB sia abbastanza grande da contenere tutti i tuoi dati InnoDB

10
RolandoMySQLDBA

Stai già memorizzando nella cache l'intero database in memoria. Il problema è quasi sicuramente il tempo necessario per la ricerca nel database, anche nella RAM.

Guarda le statistiche di I/O del tuo disco. Probabilmente vedrai che c'è solo qualche bit casuale di I/O su disco. Il database è in memoria. Non è questo il problema. Devi prima installare iostat. Non menzioni la tua piattaforma o distribuzione, ma è probabilmente in un pacchetto chiamato iostat. Potresti trovare atop più amichevole.

Le persone che ti hanno detto che lo hanno fatto dopo aver ottenuto la prova che il tuo intero database non era già in memoria o che l'I/O del disco era il problema? Altrimenti, il loro consiglio è l'equivalente di un dottore che non ti ha mai visto o esaminato ma ha appena sentito che il tuo braccio ti ha fatto male dicendoti di metterti un cast.

2
David Schwartz