- 最終アクセス時間は、NoSQLがいい
- ユーザーデータ、などもできれば
- イベントデータは必ず別テーブルに
DELETE
- mysql 5.5 では change bufferingを使って、delete 10倍高速にできる
- partition DROPのほうがよいが
UPDATE
- innodb_flush_log_at_trx_commit=0
- innodb_buffer_ppol_sizeを実めもりまであげる
監視
- SHOW GLOBAL STATUS
- 更新頻度
- 並列度
- CPUコア数に近いと限界に近い
- Threads_runninng
- SHOW GLOBAL STATUS分を-1する
- マスタの場合、BINLOG DUMPスレッド文も引く
- EventScheduler利用時はさらに-1する
遅いクエリを探す
- スロークエリログ
- SHOW FULL PROCESSLIST
- SET GLOBAL long_query_time=0 (コネクションプールに注意)
- 全てのクエリをスローログに出す
- それをpt-query-digest(mk-query-digest)、mysqldumpslowで解析する
- SET GLOBAL log_queries_not_using_indexes=1
- long_query_timeを超過していないフルテーブル、フルインデックススキャンが出る
【簡単】サーバーを止めずに性能分析
-- 現在値メモ
mysql> SELECT @@slow_query_log_file;
mysql> SELECT @@long_query_time;
-- 有効化
mysql> SET GLOBAL slow_query_log = 1; -- log_queries_not_using_indexesでも可
mysql> SET GLOBAL slow_query_log_file = '/tmp/test.log';
mysql> SET GLOBAL long_query_time = 0;
-- 数十分後設定を戻す
$ mysqldumpslow -s t /tmp/test.log
重いトランザクションを検知する
- 上記の方法では、クエリ自体が遅いものは発見できるが、TX待ちの遅いクエリは発見できない
- SHOW ENGINE INNODB STATUS
- アクティブなトランザクション一覧を出してくれる
- 待っているクエリはわかるが、何のクエリが原因でまっているかはわからない
- 原因クエリの発行元IPはわかる
- MySlowTranCapture
- NWパケットを読みTX時間が一定以上のものをログに出す
ロック競合対策
- ソシャゲではUSER_IDがWHEREになるため、あまり発生しない
- しかし、ヘビーユーザーのバトル等で発生し得る
- SET GLOBAL innodb_lock_wait_timeout=2〜5;
- innodbのデッドロック検知は、当然同一インスタンス内でのみ