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
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 .
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:
WHERE engine IN ('InnoDB','MyISAM')
za WHERE engine='InnoDB'
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
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í.