赤字(問題有)で表示されている項目がある。
貧乏性な私には、損しているぞ~ 損しているぞ~と言われている気がして気持ちが悪い。
よってMySQLにチューニングを施すことにした。
設定は以下のファイルにて行う。
(/etc/mysql/my.cnf)
#key_buffer
#検索に使われるインデックスをバッファに保存する際のメモリサイズです。
#メモリに余裕がある場合増やすとパフォーマンスが向上します。
#MySQL ABでは,マシンに搭載しているメモリーの1/4を推奨値としている。
#key_buffer = 16M (変更前)
key_buffer = 1024M (変更後)
#table_cache
#データのキャッシュサイズです。
#値を大きくすることでディスクのI/Oが減りパフォーマンスが向上します。
#接続数が少ない人はあんまり関係ないみたいだが、そのうち増やすかも
#table_cache = 64 (デフォルトのまま:変更なし)
table_cache = 256
#tmp_table_size
#構文実行中にサーバによって自動的にディスクに作成された一時テーブルの数です。
#Created_tmp_disk_tables が大きい場合、原因の一時テーブルをディスクベースの変わりにメモリベースにさせるように、
#値 tmp_table_size を増やしたいでしょう。
#tmp_table_size メモリ内のテンポラリテーブルがこのサイズを超えると、
#MySQL は自動的にこれをディスク上の MyISAM テーブルに変換する。詳細な GROUP BY クエリを頻繁に行い、
#メモリに余裕がある場合は、tmp_table_size 値を大きくする。
tmp_table_size = 256MB
#最大接続数
#max_connections = 100
max_connections = 8 (そもそも私以外が使うことはあまり考えていないので下げる)
#sort_buffer_size
#この値はコネクションごとに必要となるので注意
sort_buffer_size = 4M
そしてここまでやると赤字はほとんど消えたが、以下の2点の赤字が消えない。
Handler_read_rnd_next 3,385
Opened_tables 144
Opened_tablesに関しては、テーブルキャッシュの値を上げれば消えるらしいのだが、
いくら上げても赤字は変わらないので、放置。
Handler_read_rnd_next は照会がインデックスを利用するように書かれていないことを示唆するらしい。
とは言っても、再起動直後ですでに赤字になっているのはなぁ・・・
こういう場合、普通はSQLを調査する。ただし今回の場合には調査すら不可能。
SQL文に問題が無いかを調べるにはSQL文の前に explainキーワードをつける。
実行結果
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY
1 PRIMARY
1 PRIMARY BJ ref PRIMARY PRIMARY 4 const 2804
1 PRIMARY DJ eq_ref PRIMARY PRIMARY 8 const,lfll.BJ.code 1 Using where
3 DERIVED Select tables optimized away
2 DERIVED BD ALL 8 Using where
■統計情報の更新
MyISAMでは定期的に統計情報の更新を行う必要がある。
統計情報の更新を行わない場合には、適切なIndexが使用されない為
開発者がforce indexなどでindexを指定する必要がある。
統計情報の更新を行うためにはanalyze table やoptimizeテーブル、
indexの作成などの方法がある。
それぞれ相当重い処理であるため、注意が必要である。
■ストレージエンジンのMemoryの速度
やっていくうちにストレージエンジンをMemoryにしたくなって来たが
以下のベンチマークを見ているうちにMyISAMでいいかと思えた。
http://www.thinkit.co.jp/free/article/0608/1/6/
Memoryのストレージエンジンが思ったよりも速くないんですよね。
転送速度だけで考えるのならば、メモリ(6.4~12.8GB/s)とHDD(60~90MB/s)では
速度差が100倍近くあるはずなのですが、
それ以外の計算で時間がかかっているため、このような結果になっているのでしょう。