【研究課題レポート】MySQL ストレージエンジン性能比較 | サイバーエージェント 公式エンジニアブログ
※これは社員のOkadaさんによって執筆された、第1回研究課題レポートの優秀研究賞受賞作品の抜粋です。古い情報ですので、最新のバージョンを利用する方は、結果を参考程度にとどめてください。

1.使用するOS, HW, MySQL,サービス,ベンチマークについて

1.1 使用するOSとHW
  • OS

  • OSCnetOS4.6(Final)
    Kernel2.6.9-67.ELsmp
    I/O schedulerCfq
    File systemext3

  • HW

  • CPUQuad Core Intel(R) Xeon(R) CPU X5460 @ 3.16GHz * 1
    Memory4G
    RAIDServeRAID-8k RAID5
    Stripe-unit size:256KB(Default)
    HDDSAS 73GB 15krpm * 5本


1.2 比較を行うMySQLと各Engine

MySQL4.1.21MyISAM
InnoDB
Memory
MySQL5.0.67MyISAM
InnoDB
Memory
MySQL5.1.28rcMyISAM
InnoDB
Memory
MySQL5.1.23a-maria-alphaMaria
MySQL6.0.5-alphaFalcon


1.3 今回の検証に利用するサービス

ブログ(mobile)のログイン管理用とスキン情報のデータベースを利用

1.4 使用するDBの詳細情報
DB構成

Master:1台
Slave:3台
 ブログモバイルで2台
 その他サービスで1台

各データ件数

モバイル登録ユーザー及びログイン情報:役2,000,000件
総スキン数:155件
スキン適用ユーザ数:約1,100,000会員

ピークタイム時のSQL発行回数(Slave1台あたりの発行回数)

ブログモバイルのみ
 Select:58,000/分程度

ブログモバイル以外のサービス
 Select:20,000/分程度

以下は共通
 Insert:60/分程度
 Update:900/分程度
 Delete:10/分程度

1.5 使用するベンチマークツール

super-smack-1.3

ベンチマークで使用するSQLの内容
  1. ログイン状態チェックSQL

  2.  1件問い合わせ ※パラレルで同時5スレッド実行
  3. ブログ情報取得SQL

  4.  1件問い合わせ
      1スレッドにつき3回SQL実行
  5. ブログ表示時のスキン情報取得SQL

  6.  1件問い合わせ
      1スレッドにつき3回SQL実行
  7. ユーザ別スキン情報取得SQL

  8.  1件問い合わせ
  9. 現在有効なスキン情報全件取得SQL

  10.  複数件問い合わせ
  11. スキン詳細情報取得SQL

  12.  1件問い合わせ
  13. ジャンル別のスキン情報取得SQL

  14.  複数件問い合わせ
     1スレッドにつき4回SQL実行



2.使用するEngineの設定と調査

2.1 Engine別 My.cnf設定
MyISAMkey_buffer_size = 1G
read_buffer_size = 8M
read_rnd_buffer_size = 16M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_max_extra_sort_file_size = 10G
myisam_repair_threads = 1
InnoDBinnodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 3G
innodb_data_file_path = ibdata1:300M:autoextend
innodb_file_per_table
innodb_flush_log_at_trx_commit = 0
innodb_file_io_threads = 4
innodb_thread_concurrency = 16
innodb_log_buffer_size = 8M
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
Mariamaria_checkpoint_interval = 90
maria_log_purge_type = immediate
maria_pagecache_buffer_size = 2G
maria_pagecache_division_limit = 100
maria_repair_threads = 5
maria_sort_buffer_size = 16M
Memorymax_heap_table_size = 3G
Falconfalcon_record_chill_threshold = 1024
falcon_record_memory_max = 1073741824


2.2 Engine関する調査と問題点について

  1. Memory
    • 4.1 以降のバージョンで一部のSQLでレスポンスが著しく低下した。
       →調査したところ、INDEXのデフォルトが「HASH」になってしまうため、「ORDER BY」句を含むSQLのレスポンスが悪化していた。
        →改善として「ORDER BY」で利用するINDEXを全て「BTREE」に変更した。

  2. Maria
    • 「maria_block_size」を変更しテーブルを使用するとクラッシュ(mysql デーモンが再起動)してしまう。
    • 基本構造がMyISAMと同じだが、トランザクション管理をするファイル「maria_log_control」、「maria_log.xxxxxxxx」が作成される
    • ファイル構成は「tablename.MAD」がデータ、「tablename.MAI」がインデックスになる
    • MyISAMとMariaの比較
      • DataFile
      • ★MyISAM

        -rw-rw---- 1 mysql mysql 74M 9月 23 15:02 tablename.MYI
        -rw-rw---- 1 mysql mysql 100M 9月 23 15:02 tablename.MYD
        -rw-rw---- 1 mysql mysql 57M 9月 23 15:02 tablename.MYI
        -rw-rw---- 1 mysql mysql 82M 9月 23 15:02 tablename.MYD

        ★Maria

        -rw-rw---- 1 mysql mysql 69M 9月 23 15:10 tablename.MAI
        -rw-rw---- 1 mysql mysql 112M 9月 23 15:10 tablename.MAD
        -rw-rw---- 1 mysql mysql 50M 9月 23 15:10 tablename.MAI
        -rw-rw---- 1 mysql mysql 94M 9月 23 15:10 tablename.MAD

        若干データファイルが大きく、インデックスファイルが小さくなる

      • my.cnf

      • MyISAMMaria
        Key_buffer_sizemaria_pagecache_buffer_size
        sort_buffer_sizemaria_sort_buffer_size
        myisam_repair_threadsmaria_repair_threads
        myisam_max_sort_file_sizemaria_max_sort_file_size

      • 「SHOW STATUS」の値

      • MyISAMMaria
        Key_blocks_not_flushedMaria_pagecache_blocks_not_flushed
        Key_blocks_unusedMaria_pagecache_blocks_unused
        Key_blocks_usedMaria_pagecache_blocks_used
        Key_read_requestsMaria_pagecache_read_requests
        Key_readsMaria_pagecache_reads
        Key_write_requestsMaria_pagecache_write_requests
        Key_writesMaria_pagecache_writes


        値の構成がMyISAMと変わらないので、「mMeasure」で表示させるのも簡単

    $サイバーエージェント 公式エンジニアブログ-研究課題レポート

  3. Falcon
    • 現在のバージョンでは使用できるレベルではなかった。
      「falcon_record_chill_threshold」、「falcon_record_memory_max」等設定変更を行わないとErrorが発生し途中で落ちてしまう。(mysql デーモンが再起動またはスレッドが切れてしまう)
      また、設定が終了しても、レプリケーション設定行い更新処理が実行され始めるとTableLockが発生してしまう。
    • FalconはTableSpace管理になるので、必ずTableSpaceを作成する必要がある。

    •  例)
       CREATE TABLE name ADD DATAFILE 'name.fts' ENGINE FALCON;
        データディレクトの配下にファイルが作成される。
        -rw-rw---- 1 mysql mysql 347M 9月 22 22:29 name.fts

       ALTER TABLE tablename TABLESCPCE name ENGINE FALCON;
        スキーマティレクトの配下には「.frm」しか作成されず、データは全て作成したTableSpaceに入る。

      また、テンポラリ用のTableSpace「falcon_temporary.fts」、デフォルトTableSpace「falcon_user.fts」、おそらくバイナリログを保有していると思われる「falcon_master.fl1」、「falcon_master.fl2」が存在する。
    • その他問題点
      「DROP TABLE」を実行してもTableSpaceが肥大化していくだけで、削除できない。
      SELECTで「WHERE」および「LIMIT」をつけない場合は結果が戻ってこない。


3.ベンチマーク結果

テストケース
  1. ログイン状態チェックSQL
  2. ブログ情報取得SQL
  3. ブログ表示スキン情報取得SQL
  4. ユーザ別スキン情報取得SQL
  5. 現在有効なスキン情報全件取得SQL
  6. スキン詳細情報取得SQL
  7. ジャンル別のスキン情報取得SQL


3.1 1秒間のクエリ発行回数結果

1スレッド実行
 ABCDEFG
MyISAM(4.1.21)623504685604309773296
InnoDB(4.1.21)618497680599310776289
Memory(4.1.21)686501682615320800305
MyISAM(5.0.67)604447614581307768282
InnoDB(5.0.67)637464595581308771282
Memory(5.0.67)1158470630597330826294
MyISAM(5.1.28rc)575453604572311779273
InnoDB(5.1.28rc)622459593572306767270
Memory(5.1.28rc)1179462610593326816295
Maria(5.1.23a-maria-alpha)420463667604232582271
Falcon(6.0.5-alpha) ※1---------------------


5スレッド実行
 ABCDEFG
MyISAM(4.1.21)458599747754383959365
InnoDB(4.1.21)443477577650355838313
Memory(4.1.21)665560709770396991378
MyISAM(5.0.67)419585719749384961363
InnoDB(5.0.67)507535674738379948360
Memory(5.0.67)12515596487724011002380
MyISAM(5.1.28rc)411567705753386966361
InnoDB(5.1.28rc)419530672725373934351
Memory(5.1.28rc)12525616847734031007381
Maria(5.1.23a-maria-alpha)405595709745383959358
Falcon(6.0.5-alpha) ※1---------------------


10スレッド実行
 ABCDEFG
MyISAM(4.1.21)361576727756385964368
InnoDB(4.1.21)361366420478245613237
Memory(4.1.21)521560712772398997379
MyISAM(5.0.67)317571712744384960360
InnoDB(5.0.67)336454559616318795305
Memory(5.0.67)12555626867764011002381
MyISAM(5.1.28rc)304562681751388970346
InnoDB(5.1.28rc)305432554597302757290
Memory(5.1.28rc)12435646857734031008381
Maria(5.1.23a-maria-alpha)302574691740383959344
Falcon(6.0.5-alpha) ※1---------------------


100スレッド実行
 ABCDEFG
MyISAM(4.1.21)235390694769392982371
InnoDB(4.1.21)356329379436213533219
Memory(4.1.21)267516706778378947379
MyISAM(5.0.67)2203656657843991000361
InnoDB(5.0.67)340321368423208521213
Memory(5.0.67)1388564786805388971400
MyISAM(5.1.28rc)2093496547884051013369
InnoDB(5.1.28rc)338320390457209524215
Memory(5.1.28rc)1406563780810387969406
Maria(5.1.23a-maria-alpha)2103466557714081020354
Falcon(6.0.5-alpha) ※1---------------------


※1 Falcon自体安定しておらず、負荷をかけることができなかった。

3.2 スレッド増加ごとの各SQLグラフ

ログイン状態チェックSQL

$サイバーエージェント 公式エンジニアブログ-研究課題レポート

ブログ情報取得SQL

サイバーエージェント 公式エンジニアブログ-研究課題レポート

ブログ表示時のスキン情報取得SQL

サイバーエージェント 公式エンジニアブログ-研究課題レポート

ユーザ別スキン情報取得SQL

$サイバーエージェント 公式エンジニアブログ-研究課題レポート

現在有効なスキン情報全件取得SQL

サイバーエージェント 公式エンジニアブログ-研究課題レポート

スキン詳細情報取得SQL

サイバーエージェント 公式エンジニアブログ-研究課題レポート

ジャンル別のスキン情報取得SQL

サイバーエージェント 公式エンジニアブログ-研究課題レポート

※2 Falcon自体安定しておらず、負荷をかけることができなかった。

4.Engine別の評価

MyISAM

ユニークインデックス、プライマリキー検索は、スレッド数を上げるとファイルロックが頻発してしまうため、大幅にレスポンスが悪化してしまった。
ただ、それ以外の全件検索やレンジ検索については、ある程度のレスポンスを維持することが出来ていた。

InnoDB

全体的に悪いレスポンス結果になってしまった。
ただ、「ログイン状態チェックSQL」は、10スレッドと100スレッドでのレスポンスは大きく変わらなかった。
InnoDB独自の行ロックがうまく機能していると思われる。
他の検証でFileSystemの「ext3」と「InnoDB」の組み合わせに問題が見られるので、一概にInnoDBの性能が悪いとは言えない。
今後は、他のFileSystemでの検証を行う必要がある。

Memory

スレッド数を上げれば上げるほどより多くのSQLを返すことができたので、性能は今回検証した全てのEngineで一番よい結果になった。
ただ、INDEXの動作として「HASH」の方が良いのか「BTREE」の方が良いのかは検討する必要がある。
また、Memoryテーブルは可変長カラムを全て固定長に変換されるため、1レコードのバイト数が大きくなる。
 →場合によっては、より多くのメモリーを必要とするか、利用できない可能性が出てきてしまう。

Maria

まだ、alpha版なのでなんとも言えないが、レスポンスは全ての結果においてよかったといえる。
特に、全件検索、レンジ検索については、スレッド数を上げてもレスポンスは悪化しなかった。Indexのキャッシュ方式などがMyISAMとは違うのか、今後調査を行っていきたい。
MyISAMにかわる次世代のEngineとしては期待できる結果になった。

5.今後の課題

MySQLのバージョン別、Engine別の評価は出来たが、InnoDB等でレスポンスが悪化した件について、調べていかなくてはいけない。

今後は、FileSystem、Kernelの設定等を組み合わせることで、よりよいパフォーマンスが出せるか検証を行う。

また、新EngineのMariaについても、今後どのようにキャッシュを利用しているのか調査する。