RDS for AuroraとRDS for MySQL5.6のParameter Groupsの違いをみてみた

# RDS for Aurora
Auroraは2014年のre:Invent2014で発表された、AWSがクラウドネイティブ時代に、再考したMySQL5.6と互換性を持った作った新しいデータベースです。Auroraの特徴は既に情報も出来てきていて、どんな特徴を持ったデータベースかご存知の方も多かと思いますが、Auroraの概要は以下のスライドと発表Blogをご覧ください。
[スライド](http://www.slideshare.net/AmazonWebServices/sdd415-new-launch-amazon-aurora-amazons-new-relational-database-engine-aws-reinvent-2014) / [英語Blog](https://aws.amazon.com/blogs/aws/highly-scalable-mysql-compat-rds-db-engine/) / [日本語Blog](http://aws.typepad.com/aws_japan/2014/11/highly-scalable-mysql-compat-rds-db-engine.html)

# Parameter Groups
Parameter Groupsを一言で言うと、MySQLでいう`my.cnf`です。RDSでは直接ホストサーバにログインすることが出来ないので、Parameter Groupsを使ってMySQLに与えるパラメータを変更します。全てのパラメータが変更可能というわけではなく、一部変更不可能なものも存在します。

Auroraのlimited previewで既にAurora環境をテスト出来る方も増えてきているのではないかと思いますが、ベンチマークで重要になってくる、このParameter Groupsのデフォルト値をRDS for MySQL5.6と比較してみました。SQLレベルでの互換性はありますが、パラメータなどはAurora独自の設定があったり、もちろん実際のユースケースに応じて変更していただくと性能が引き出せると思います。
MySQLとAuroraをデフォルトパラメータ同士でパフォーマンス測定をして性能比較してみるという場合はdefault値で違いがあることを是非確認してみてください。

# まずはお約束
**今回比較してみたParameter Groupsは2015/6/24現在のもので今後も変わる可能性が大きくあります。**
そのためベンチマークなどを行う前にその時のdefault Parameter Groupの値を是非確認してみてください。

# 比較してみた
default.mysql5.6とdefault.aurora5.6で違う部分のみをざっくり取り出してみました。
`DBInstanceClassMemory`は各DBインスタンス内で使えるメモリ容量の変数です。

## default値
| パラメータ名 | MySQL5.6 | Aurora | 変更可否 |
|:-----------|------------|------------|------------|
| default_tmp_storage_engine       | InnoDB|     myisam    | N |
| innodb_buffer_pool_size       | {DBInstanceClassMemory*3/4} |     {DBInstanceClassMemory*6/10}    | Y |
|innodb_checksum_algorithm|innodb|none|N|
|innodb_file_per_table|ON|OFF|Y|
|innodb_undo_tablespaces|engine-default (0)|0|N|
|max_connections|{DBInstanceClassMemory/12582880}|{log(DBInstanceClassMemory/8187281408)*1000}|Y|
|query_cache_size|engine-default|{DBInstanceClassMemory/24}|Y|
|query_cache_type|0|1|Y|
|skip-slave-start|1|0|AuroraだけY|
|skip_name_resolve|0|1|Y|
|sql_mode|NO_ENGINE_SUBSTITUTION|0|Y|
|table_open_cache|2000|32000|Y|
|table_open_cache_instances|16|1|AuroraだけN|
|thread_cache_size|8|{DBInstanceClassMemory/1005785088}|Y|

## 設定可能な値
| パラメータ名 | MySQL5.6 | Aurora |
|:-----------|------------|------------|
| innodb_buffer_pool_size       | 5242880-18446744073709551615 |     1048576-9223372036854775807    |
|innodb_checksum_algorithm|crc32, innodb, none, strict_crc32, strict_innodb, strict_none|crc32, innodb, none, strict_crc32, strict_innodb, strict_none|
|innodb_undo_tablespaces|0-126|0-18446744073709551616|
|max_connections|1-100000|1-16000|Y|
|query_cache_size|0-9223372036854774784|0-9223372036854774784|
|query_cache_type|0-2|0-2|Y|
|sql_mode|ALLOW_INVALID_DATES, ANSI_QUOTES, ERROR_FOR_DIVISION_BY_ZERO, HIGH_NOT_PRECEDENCE,IGNORE_SPACE, NO_AUTO_CREATE_USER, NO_AUTO_VALUE_ON_ZERO, NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE, NO_ENGINE_SUBSTITUTION, NO_FIELD_OPTIONS, NO_KEY_OPTIONS,NO_TABLE_OPTIONS, NO_UNSIGNED_SUBTRACTION, NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY,PAD_CHAR_TO_FULL_LENGTH, PIPES_AS_CONCAT, REAL_AS_FLOAT,STRICT_ALL_TABLES, STRICT_TRANS_TABLES, ANSI,DB2,MAXDB,MSSQL,MYSQL323,MYSQL40, ORACLE, POSTGRESQL, TRADITIONAL|0,ANSI, ALLOW_INVALID_DATES, ANSI_QUOTES,ERROR_FOR_DIVISION_BY_ZERO, HIGH_NOT_PRECEDENCE,IGNORE_SPACE, NO_AUTO_CREATE_USER, NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE, NO_ENGINE_SUBSTITUTION, NO_FIELD_OPTIONS, NO_KEY_OPTIONS,NO_TABLE_OPTIONS, NO_UNSIGNED_SUBTRACTION, NO_ZERO_DATE, NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY,PAD_CHAR_TO_FULL_LENGTH, PIPES_AS_CONCAT, REAL_AS_FLOAT,STRICT_ALL_TABLES, STRICT_TRANS_TABLES, TRADITIONAL|
|table_open_cache|1-524288|1-524288|
|thread_cache_size|0-16384|0-16384|

## 今のところの所感
innodb_buffer_pool_size / query_cache / table_open_cache などの性能面に関わるパラメータがインスタンス内で利用可能なメモリ容量に応じて自動的に変化し、インスタンスタイプによってはRDS for MySQL5.6と比較して、かなり小さい値になることもあります。query_cacheに関してはquery cacheのルックアップやインバリデートなどのためquery cacheがあまり効かないケースではオーバヘッドが大きくなってしまうので注意が必要です。
その他にもmax connectionの設定可能範囲やdefault値も少なくなっています。そのため、ベンチマークを取る際に性能に差がでる場合などはこの変のパラメータを揃えてみるなどして変化を観測すると特性が見えてくるかと思います。細かいところだと、sql modeの差異もあります。

# お約束
こちらは個人の意見で会社とは関係ありません。お約束です。
再掲しますが、**今回比較してみたParameter Groupsは2015/3/23現在のもので今後も変わる可能性が大きくあります。**