Memorizza nella cache il database MySQL


11

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 ora ha dato lo stesso problema con i test con unità SSD Intel 320, quindi non penso che si tratti nemmeno di query elevate.

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

Ho 16 GB di 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

Risposte:


10

Se fossi in te, cambierei tutti i dati su InnoDB. Il blocco della tabella / 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 solo nella cache 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 per un massimo dell'80% di RAM e del 10% per DB Conenctions e lasciare il 10% per il sistema operativo. Questo vale anche per diversi sistemi operativi .

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

Puoi sempre configurare la memoria per InnoDB in modo più efficace rispetto a MyISAM. C'è sempre un modo per modificare InnoDB in base alle proprie esigenze di prestazione . Man mano che i tuoi dati crescono, alla fine diventeranno 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ò genererà 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:

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

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

NOTA FINALE: assicurarsi che il pool di buffer InnoDB sia sufficientemente grande da contenere tutti i dati InnoDB


2

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 iostatprima installare . Non menzioni la tua piattaforma o distribuzione, ma è probabilmente in un pacchetto chiamato iostat. Potresti trovare atoppiù 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.


-1

Installa un buon plugin di memorizzazione nella cache per Wordpress, potrebbe essere d'aiuto. Ma prima o poi devi capire il collo di bottiglia che rallenta il tuo sistema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.