it-swarm-eu.dev

Vyrovnávejte MySQL databázi v paměti

Mám problémy s webovým serverem s 600 MB databáze MySQL. Web je příliš pomalý. Všiml jsem si, že čím větší je databáze MySQL, tím pomalejší. Když to bylo 5 MB, web byl velmi rychlý. Když se to začalo zvětšovat, začalo to být pomalejší a pomalejší a nyní, při 600 MB, je to opravdu pomalé, načítání stránek trvá přibližně 10 sekund.

Zkontroloval jsem top procesy a nic to nesouviselo s vysokým zatížením nebo tak něco. Ani to nesouvisí s IOPS, protože jsem testoval na HDD 7,2 000 rpm discích a nyní to způsobilo stejný problém s testováním s disky Intel 320 SSD, takže si nemyslím, že se jedná o vysoké dotazy.

Web používá Wordpress a existuje 9 aktivních pluginů. Lidé říkali, že by to mohly být pluginy ... no možná ... ale právě teď chci jen mezipaměť celé databáze v paměti a chtěli bychom získat pomoc a pokyny, kde začít a jak na to.

Mám 16 GB RAM a i5-2400 4 jádra @ 3,1 GHz. OS je 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

Kdybych byl tebou, přepnul bych všechna data na InnoDB. Zamykání tabulek/zamykání řady bylo již mnoho diskutováno. Vždy bych si vybral InnoDB ruce dolů. Nicméně existuje další hluboký důvod pro volbu InnoDB ... CACHING .

Zatímco většina lidí se chlubí, že MyISAM je rychlejší pro čtení, většina lidí zapomíná, že mnoho mezipaměti pro MyISAM, která se nazývá mezipaměť klíčů (nastavená pomocí key_buffer_size), ukládá do mezipaměti pouze indexové stránky ze souborů .MYI. Nikdy neukládá do mezipaměti datové stránky. V 32bitových systémech má oficiální maximum 4 GB. 8 GB je nejlepší maximum pro 64bitové.

Fond vyrovnávacích pamětí InnoDB ukládá do mezipaměti data a indexové stránky. V závislosti na serveru, který máte, můžete ukládat do mezipaměti až celý soubor dat v paměti RAM. Můžete vyladit InnoDB až pro 80% RAM a 10% pro DB Conenctions a ponechat 10% pro OS. To platí i pro různé operační systémy .

Doporučil jsem tyto věci pro Drupal zákazníci s úžasným úspěchem. Platí pro Wordpress stejně dobře. Poskytl jsem podporu DB klientům s WordPress. Stejná vylepšení.

Vždy můžete nakonfigurovat paměť pro InnoDB efektivněji, abyste mohli více MyISAM. Vždy existuje způsob, jak tweek InnoDB, aby vyhovoval vašim výkonovým potřebám . Jak vaše data rostou, nakonec to bude stane se požadavkem .

UPDATE 2011-11-21 11:44 EST

Pokud je váš úplný dataset dostatečně malý, můžete spustit dotaz SELECT na každé tabulce, kterou máte hned po spuštění mysql.

Pro všechny tabulky, které jsou InnoDB a/nebo MyISAM, spusťte tento dotaz:

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
;

Tím se vytvoří každý možný SELECT dotaz, který je třeba spustit, který vyvolá všechny indexy, na které se má odkazovat. Umístěte tento dotaz do souboru s názvem /root/MakeSelectQueriesToLoad.sql. Spusťte skript a sbírejte výstup /root/SelectQueriesToLoad.sql. Nakonec to spusťte:

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

Tím se určitě předběžně načtou všechny indexové stránky do vyrovnávací paměti InnoDB a klíčové mezipaměti MyISAM. Pokud jsou všechna vaše data InnoDB, proveďte dvě změny:

  • nahradit WHERE engine IN ('InnoDB','MyISAM') za WHERE engine='InnoDB'
  • nahradit CONCAT('SELECT ',ndxcollist,' FROM ', za CONCAT('SELECT * FROM ',

Tím se také naplní více datových stránek do fondu vyrovnávacích pamětí InnoDB.

ZÁVĚREČNÁ POZNÁMKA: jistěte se, že fond vyrovnávacích pamětí InnoDB je dostatečně velký, aby pojal všechna vaše data InnoDB

10
RolandoMySQLDBA

Již ukládáte do mezipaměti celou databázi v paměti. Problém je téměř jistě čas potřebný k prohledávání databáze, dokonce i v RAM.

Sledujte své I/O statistiky disku. Pravděpodobně uvidíte, že existuje jen občasný náhodný bit I/O disku. Databáze je v paměti. To není problém. Nejprve musíte nainstalovat iostat. Nezmiňujete svou platformu ani distribuci, ale pravděpodobně je to v balíčku s názvem iostat. Můžete si prohlédnout atop přátelštější.

Udělali to lidé, kteří vám to řekli, poté, co získali důkaz, že celá vaše databáze ještě nebyla v paměti nebo že problémem je disk I/O? V opačném případě je jejich rada ekvivalentem lékaře, který vás nikdy neviděl ani nevyšetřil, ale právě slyšel, že vám bolí paží a říká vám, abyste na něj nasadili obsazení.

2
David Schwartz