MySQLTunerを使ってMySQLを速くする

MySQLTunerはMySQLを診断して、いろいろアドバイスしてくれるプログラム。perlスクリプトで提供されているので、簡単に実行できる。なおWindowsでは動かないらしい。

ダウンロードして実行する。

$ wget http://mysqltuner.com/mysqltuner.pl
$ chmod +x mysqltuner.pl
$ ./mysqltuner.pl

以下のようなエラーが出た。

>> MySQLTuner 0.9.9 - Major Hayden
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password:
[!!] Unable to determine total memory/swap; use '--forcemem' and '--forceswap'

–forcememと–forceswapを指定して再実行。

$ ./mysqltuner.pl --forcemem 256 --forceswap 128
>>  MySQLTuner 0.9.9 - Major Hayden <major@mhtx.net>
>>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
>>  Run with '--help' for additional options and output filtering
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password:
[--] Assuming 256 MB of physical memory
[--] Assuming 128 MB of swap space
 
-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.27-standard
[OK] Operating on 32-bit architecture with less than 2GB RAM
 
-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 38M (Tables: 1630)
[--] Data in InnoDB tables: 480K (Tables: 9)
[!!] Total fragmented tables: 67
 
-------- Performance Metrics -------------------------------------------------
[--] Up for: 36m 14s (2K q [1.220 qps], 133 conn, TX: 8M, RX: 769K)
[--] Reads / Writes: 93% / 7%
[--] Total buffers: 34.0M global + 2.7M per thread (100 max threads)
[!!] Maximum possible memory usage: 302.7M (118% of installed RAM)
[OK] Slow queries: 0% (2/2K)
[OK] Highest usage of available connections: 7% (7/100)
[OK] Key buffer size / total MyISAM indexes: 8.0M/23.4M
[OK] Key buffer hit rate: 99.2% (49K cached / 406 reads)
[!!] Query cache is disabled
[OK] Sorts requiring temporary tables: 3% (18 temp sorts / 541 sorts)
[!!] Joins performed without indexes: 13
[!!] Temporary tables created on disk: 31% (133 on disk / 429 total)
[!!] Thread cache is disabled
[!!] Table cache hit rate: 1% (64 open / 5K opened)
[OK] Open file limit used: 12% (127/1K)
[OK] Table locks acquired immediately: 100% (2K immediate / 2K locks)
[OK] InnoDB data size / buffer pool: 480.0K/8.0M
 
-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
MySQL started within last 24 hours - recommendations may be inaccurate
Reduce your overall MySQL memory footprint for system stability
Enable the slow query log to troubleshoot bad queries
Adjust your join queries to always utilize indexes
When making adjustments, make tmp_table_size/max_heap_table_size equal
Reduce your SELECT DISTINCT queries without LIMIT clauses
Set thread_cache_size to 4 as a starting value
Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
*** MySQL's maximum memory usage exceeds your installed memory ***
*** Add more RAM before increasing any MySQL buffer variables  ***
query_cache_size (>= 8M)
join_buffer_size (> 128.0K, or always use indexes with joins)
tmp_table_size (> 32M)
max_heap_table_size (> 16M)
thread_cache_size (start at 4)
table_cache (> 64)

いっぱい出てきたが[!!]で始まっているのはやばいやつみたい。そして最後のRecommendationsにお奨めの直し方が書いてあると思われる。

最初のやつは[Run OPTIMIZE TABLE to defragment tables for better performance]なのでテーブルを最適化してデフラグしろってことらしい。検索してみたところこのサイトが見つかった。以下のコマンドを実行すればよいらしい。ただしmysqlが動いている状態じゃないとだめとのこと。このサイトでは一時的にhttpdを止めることを推奨している。

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases

これを実行後、再びmysqltunerを実行したところ、また同じRecommendationsが出たがmysqlを再起動後実行したら消えた。

次は[Reduce your overall MySQL memory footprint for system stability]だがメモリの使用量を減らせということだろうか?これはスルー。

次は[Enable the slow query log to troubleshoot bad queries]、まずいクエリーのログためにスロークエリログを有効に、ということらしい。スロークエリログとは、long_query_timeよりも時間がかかったクエリーのことらしい、これをログに取っておけばいろいろ調べられるということか。

これを有効にするにはmysqldの起動オプションに–log-slow-queries[=file_name]を加えるらしい。または以下の記述をmy.cnfに加えてもいいみたいだ。ここでは後者を採用。

[mysqld]
set-variable=long_query_time=1
log-slow-queries=/var/lib/mysql/log-slow-queries.log

これを記述後mysqlをリスタートし、/var/lib/mysql/log-slow-queries.logができていることを確認した。そのご再び、mysqltunerを実行してRecommendationsが消えたことを確認。

次が[Set thread_cache_size to 4 as a starting value]、スレッドキャッシュとはプールしておくスレッドの数のようだ。
my.confにthread_cache_size=4を記述して終了。

あとのRecommendationsはSQLを発行する側の問題だと思うので、これで終了。

次に[Variables to adjust]で以下の指摘がなされている。

query_cache_size (>= 8M)
tmp_table_size (> 32M)
max_heap_table_size (> 16M)

my.cnfに以下のように書いた。

query_cache_size=8M
tmp_table_size=32M
max_heap_table_size=16M

query_cache_sizeはその名のとおりクエリの結果をキャッシュしておくものだと思うが、これを付けたら速くなった気がする。このwordpressの一番下のHTML convert timeがリロードしたとき速くなった。

結局[!!]で始まるものは[!!] Maximum possible memory usage: 310.7M (121% of installed RAM)]以外消せたのでよしとしよう。

関連記事:
eAcceleratorをインストールしてPHPを高速化する

One response on “MySQLTunerを使ってMySQLを速くする

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">