7
8

More than 5 years have passed since last update.

Mysqlストレージエンジンまとめ

Posted at

主なストレージエンジン種類(テーブル毎に選択可能)

  • MyISA

    • トランザクション無し
    • 主にログ系でDWHとして使用
  • InnoDB

    • トランザクション有り
    • 運用テーブルはInnoDB一択

ストレージエンジンの仕組み

  1. クライアントからの接続受付。スレッドバッファを確保し、切断時にキャッシュ保存等
  2. クエリキャッシュヒット確認
    • SQLがクエリキャッシュされてたら返す
  3. パーサ解析
    • クエリ構文チェック
  4. SQL実行計画の決定(オプティマイザ)
    • indexの可否、indexの選択等

テーブルのファイル構成

レコードのカラム情報や、ストレージエンジン情報等
* /var/lib/mysql/[user_name]/[table_name].frm

insertやupdateされたデータ
* /var/lib/mysql/[user_name]/[table_name].iba

InnoDBのパフォーマンス向上のためのmy.cnf設定

OSページキャッシュを使用しない

InnoDBはbuffer_poolにキャッシュする仕組みになっているので、
OSページキャッシュは、オーバーヘッドにしかならないので切る

innodb_flush_method = O_DIRECT

バッファプールのサイズを多めに割り当てる

バッファプール確認

SHOW VARIABLES LIKE "innodb_%_size"

InnoDBはOSページキャッシュを使わず、独自のバッファプールを確保し、テーブルデータをキャッシュするので、
かなり多めに設定する必要がある。
ただし、バッファプール以外にも5〜10%程メモリを使用する為、大体、全体の8割程度に設定しておく。

innodb_buffer_pool_size = 32G

上記に設定したメモリ容量をOSから割り当てられ、キャッシュする

例えば、以下のDBサーバがあるとする
* メモリ容量
* 8GB

  • テーブルの容量
    • userテーブル : 2GB
    • tweetテーブル : 2GB
    • user_tweetテーブル : 2GB
innodb_buffer_pool_size = 6G

上記の場合だと、

テーブルの容量が6GB(userテーブル+tweetテーブル+user_tweetテーブル)なので、
全てのテーブルデータがメモリ(バッファプール)に載っかるので、
I/Oが発生せず、高速にデータの更新、参照が可能。

クエリキャッシュについて

  • クエリキャッシュは、更新時にグローバルロックを掛ける為、クエリが多い場合切った方がいい
    • 更新したクエリに影響が出るキャッシュ情報を全てチェックし、削除するためパフォーマンスが出ない

参考文献

7
8
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
7
8