免責事項
この記事はMatt Lord氏によるMySQL Server Blogの投稿「Improved Server Defaults in 5.7」(2015/7/22)をユーザが翻訳したものであり、Oracle公式の文書ではありません。
Morganと私はしばらく前にMySQLの"今やもう良くない(out of the box)"設定および挙動のデフォルト値を改善する計画を開始した。コミュニティーと密接に実施することにより、すばらしい改善の一覧が作成できた。これはMySQL 5.7.7のリリースから成果を出し始めた。私は何が変わったか、通常のユーザーおよびインストールの場合、なぜMySQLが改善されるかをざっと紹介したい。
レプリケーションの改善
- 詳細はSujathaのすばらしいブログ投稿をみていただきたい。
InnoDBの改善
- innodb_checksum_algorithm : デフォルト値を"innodb"から"crc32"に変更した。CRC32を使えば今日の大多数のサーバーではハードウェアアクセラレーションが利用でき、これにより適切な全般的性能強化が適用されるはずである。
- innodb_page_cleaners : デフォルト値を1から4に変更した。これによりバッファプールからダーティーページをフラッシュする処理が標準でマルチスレッド化される(innodb_buffer_pool_instancesの値の方が小さい場合は自動的に小さくなる)
- innodb_purge_threads : デフォルト値を1から4に変更した。これにより利用されなくなった値をインデックスからパージして削除し、前にDELETE文によって削除とマークされた行を物理的に削除する処理が標準でマルチスレッド化される。これは高負荷なシステムの全体の性能を向上させる。
- innodb_strict_mode : デフォルト値をOFFからONに変更した。これによりInnoDBが一致協力してMySQLをデフォルトでより厳格に動作させるという全体のゴールに沿うようになり、データの完全性、信頼性、堅牢性を確かなものにするのに役立つ。これはMySQLをよりSQL標準準拠させるというゴールにも該当することになる。
- InnoDBバッファプールのウォームアップ : 次の変更によりMySQLを再起動した時に、バッファプールのページのうち最もホットである25%のページを維持しキャッシュが暖まった状態を維持できるようになる。すなわち、innodb_buffer_pool_dump_at_shutdown, innodb_buffer_pool_load_at_startupそして、innodb_buffer_pool_dump_pctである。追加の情報については、Tonyのすばらしいブログ投稿を見て欲しい。これは、MySQLを再起動した時のアプリケーション性能への影響を小さくするのに役立つ。
- innodb_file_format : 我々は最新のファイルフォーマットである、Barracudaをデフォルトとした。これにより行フォーマットのあらゆる制約が取り除かれる。これは圧縮のような全ての利用可能な機能を標準で利用可能とし(MySQLの不要な再起動をせずに)、全体のユーザーエクスペリアンスを向上させる。
- innodb_large_prefix : インデックスのキーのプレフィックスの制限を767バイトから、3072バイトに増やす。これは重要で、とりわけより多くのユーザーがUnicodeをデフォルトの文字コードとして利用するようになるに従って重要となる。
パフォーマンススキーマの改善
- 追加のコンシューマの有効化 : 我々はevents_statements_historyとevents_transactions_historyコンシューマーをデフォルトで有効化するようにした。これにより最近システム上でどのようなSQL文およびトランザクションが実行されたかというDBAが知る必要のあるとても役に立つ情報がわかる。この情報は無数の問題(その時間に実行された関連あるSQLどれでも)を追跡してとらえる時に非常に価値がある。そしてパフォーマンススキーマのオーバヘッドを小さくする絶え間ない努力により、ごくわずかな性能影響でこれが有効化できるようになった(オーバーヘッドに関する詳細な情報はTariqueのすばらしいブログ投稿をご覧いただきたい)。
セキュリティーの改善
- sql_mode : NO_AUTO_CREATE_USERを作りこれをデフォルトとした。これはGRANT文が予期せずそして自動的に認証情報が特定されずに新規アカウントを作成してしまうのを防ぐ為のものだ。これはMySQLをデフォルトでより安全にする為の取組みの1つで(セキュリティーおよびデータの安全性の改善)、デフォルトでより標準に準拠するようにもしている。
- それに加え、テストデータベースと匿名ユーザーのアカウントはMySQLのインストールの過程でもはや作成されなくなる。
実行時および全般的な改善
- table_open_caches_instances : このオプションはCPUハードウェアスレッドが多数あるシステムにおけるテーブルキャッシュ上の競合を減らすことを意図したものだ(vCPU: ソケット、コア、スレッドの組合せ)。今や汎用のデスクトップマシンでさえ、しばしば16ハードウェアスレッドを備えているので(2CPUソケット、各ソケット4コア、各コアSMT/ハイパースレッディングで2スレッド)、デフォルトを16と設定し、最近のハードウェアに対して性能が向上するようにした。
- sql_mode : STRICT_TRANS_TABLES、ERROR_FOR_DIVISION_BY_ZERO、NO_ZERO_DATE、そしてNO_ZERO_IN_DATE SQLモードがデフォルトでコンパイルされ有効となる。これにより不完全な、範囲外の、または不正な日付に対しエラーを生成するようになる。これは我々の2つの構想のキーとなる部分である。1. デフォルトでデータの妥当性および完全性を保証する、2. デフォルトでよりSQL標準に準拠する。(注記: 5.7.8以前は、これら全ての設定が1つのSTRICT_TRANS_TABLEモードにまとめられたが、コミュニティーのフィードバックにより、これらは再度分離され、MySQL 5.6またはそれ以前のリリースの状態となった。)
- show_compatibility_56 : MySQL 5.7では、SHOWコマンドの挙動の改善を行い、追加の情報を加えるだけでなく、GLOBALとSESSIONの内容にすっきりした概要説明を提供した(これはいくつかの奇妙な動作とバグレポートとなってしまった)。後方互換が必要となるケースによりよく良く対応する為に、show_compatibility_56という新しいオプションを導入し、5.7.8ではデフォルトでOFFとなっている。以前のリリースとの互換を保ちたい場合は、ユーザーはこの設定をONにするだろう。
- log_warnings : 効果的にエラーログの出力レベルをあげる為に、デフォルト値を1から2に変更した。MySQL 5.7では新しいlog_error_verbosityオプションとなり、このコンフィグオプションは廃止予定となることにも注意して欲しい。
オプティマイザの改善
- sql_mode : ONLY_FULL_GROUP_BYの挙動が大幅に改善され、現在ではデフォルトで有効化されるようになった。これらの変更についての詳細はGuilhemのすばらしいブログ投稿で確認できる。
- eq_range_index_dive_limit : デフォルトを10から200に変更した。この変更は大多数の場合で全体の挙動を改善するはずだ。この変更の詳細はJorgenのすばらしいブログ投稿で確認できる。
- 新しいオプティマイザスイッチを2つ導入した。condition_fanout_filterおよびderived_mergeであり、現在ではデフォルトで有効化される。大多数のケースでよりよい性能となるため、ユーザーは設定をこのままにしたいと考えるだろう。しかしながら、ある特定のサブクエリがありこれは派生マージ(derived merge)をサポートしておらず、この特異ケースは"SQLの変更"としてMySQL 5.7のアップグレードノートに記載されている。
これらの変更についての疑問や、他の変更の推奨があれば、コメント欄で教えて欲しい。 (訳注: 元サイトのコメント欄に記載ください)
以上である。MySQLをご利用いただきありがとう。これによって、改善に寄与するだろう!