Pro své projekty používám VPS u WEDOSu. Na jedné VPS jsou jednodušší weby, které nepotřebují tolik paměti. Na druhé VPS, s podstatně lepšími parametry (2 jádra CPU, 3GB RAM), běží můj zatím na zdroje nejnáročnější projekt – HamQTH. Databáze samotná na disku zabírá něco přes 8GB. V asi 30 tabulkách se nachází přes 10 milionů záznamů. S databází se hodně pracuje, neustále se do ní něco zapisuje. I takto vybavená VPS nestíhala, dusily ji požadavky na I/O.
Jak a co tedy optimalizovat?
Cache
Práci s databází velmi zrychlíte pokud bude mít v paměti co nejvíce dat. Jestliže používáte InnoDB engine, velmi doporučuji podívat se na nastavenou hodnotu pro tuto konfigurační proměnnou:
[cc lang=“bash“]
Innodb_buffer_pool_size = 1200
[/cc] kde
Innodb_buffer_pool_size – velikost paměti pro indexy a data v MB
Na svém serveru nastavuji tuto hodnotu asi na 40 až 50 procent dostupné RAM. Běží mi tam i Apache a další služby. Kdyby se jednalo pouze do databázový server, nastavte klidně 70% velikosti RAM. Aby se změny projevily je nutné restartovat MySQL server.
SQL dotazy
Dobře navržené dotazy a indexy v databázi jsou základ. V MySQL si můžete zapnout logování dotazů trvajících déle než je stanovený limit. V /etc/mysql/my.cnf přidejte resp. upravte tyto řádky:
[cc lang=“bash“]
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2
[/cc] kde
log_slow_queries – cesta, kam logovat pomalé dotazy
long_query_time – logovat pouze dotazy trvající x sekund Po nastavení/změně hodnot je nutné restartovat MySQL server.
Zápisy na disk
I když máte na VPS vyhrazenou RAM, sdílíte procesor a co je hlavní, také disky. MySQL má ve výchozím nastavení zapnuto ukládání na disk po každém commitu. Pro bezpečnost dat je to velmi dobrá volba, bohužel v případě sdíleného I/O a velkého počtu zápisů, můžete stroj udusit. Pokud můžete přijmou malé riziko, kdy při pádu MySQL serveru přijdete o commity za poslední dvě sekundy, přidejte do my.cnf tento řádek:
[cc lang=“bash“]
innodb_flush_log_at_trx_commit = 2
[/cc]
Nyní po commitu zapíše MySQL data do cache operačního systému, která je na disk zapisována v pravidelných intervalech. Aby se změny projevily je nutné restartovat MySQL server.
Použitý engine
Pokud nepoužíváte fulltext nebo nemáte tabulky jen pro čtení, nemá smysl o MyISAM ani uvažovat. Tento engine při zápisu nebo změně kteréhokoliv řádku celou tabulku zamyká. Musí se tedy čekat až se operace provede a pak teprve je možné z tabulky číst. I malé procento zápisů způsobuje propad ve výkonu. Také nejsou podporovány transakce, cizí klíče a další funkce, které jsou pro InnoDB samozřejmostí.
A co dál?
Můžete ušetřit paměť nastavením mysql.allow_persistent na Off, použitím lehčí verze http serveru (lighttpd, nginx), smazat nevyužívané indexy, pohrát si s nastavením innodb_log_file_size atd.
Napsat komentář