LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

Webエンジニアのための データベース技術[実践]入門

Posted at

  • 最終アクセス時間は、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のデッドロック検知は、当然同一インスタンス内でのみ
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up