sql >> データベース >  >> RDS >> Mysql

高度なInnoDB設定によるMySQLパフォーマンスの向上

    InnoDBを高パフォーマンスに構成する方法については少し前に説明しましたが、高度なInnoDB設定を使用してMySQLのパフォーマンスを向上させる方法についてはまだ説明していません。このブログ投稿は、このトピックについてもう少し洞察を提供するはずです。

    InnoDBの説明

    InnoDBの設定を実際に深く掘り下げる前に、おそらく基本を理解する必要があります。InnoDBは、MySQL、MariaDB、およびPerconaServerのストレージエンジンです。このエンジンはInnoDBプラグインと呼ばれ、プラグインのセットアップとインストールが必要です。 MySQL 5.5.5がリリースされるまで、InnoDBはプラグインではなくなり、MySQLでサポートされているストレージエンジンの1つとしてMySQLパッケージの一部になりました。 MySQL 5.6のリリース以降、InnoDBはデフォルトのストレージエンジンになりました。これは、高い信頼性と高いパフォーマンスのバランスが取れた汎用ストレージエンジンです。 InnoDBの主な利点には、行レベルのロック、外部キーのサポート、およびACID(Atomicity Consistency Isolation Durability)モデルに従うことが含まれます。ACIDは、エラー、電源障害、その他の問題が発生してもデータの有効性を保証することを目的とした一連のプロパティです。 InnoDBには変数の広範なリストがあり、これらのいくつかは、特にハードウェアの種類とデータベースサーバーの利用可能なリソースのパフォーマンスを向上させるのに役立ちます。これらの中には:

    • innodb_data_file_pathは、InnoDBテーブルのデータが保存されているファイルです。
    • innodb_buffer_pool_sizeは、InnoDBがデータとそのテーブルのインデックスをキャッシュするために使用するメモリバッファーです。
    • innodb_log_file_sizeは、InnoDBログファイルのサイズを示します。 innodb_log_file_sizeが大きいほど、クラッシュが発生した場合に必要なリカバリ時間が長くなります。
    • innodb_log_buffer_sizeは、ディスク上のログファイルに書き込むためにInnoDBによって使用されます。
    • innodb_flush_log_at_trx_commitは、パフォーマンスとACIDコンプライアンスのバランスを制御します。デフォルト値は1で、InnoDB ACIDに準拠し続けるのに役立ちます。innodb_flush_log_at_trx_commitを2にすると、書き込み速度は非常に速くなりますが、最大1秒に相当するトランザクションが失われる可能性があります。

    MySQLのパフォーマンスをさらに向上させるために設定できる高度なInnoDB設定もあります。今から調べます。

    高度なInnoDB設定

    すでに述べたように、InnoDBには、パフォーマンスをさらに向上させるために使用できる高度な設定があります(すべてをリストするわけではありませんが、リストされている設定はかなり良いものになるはずです。 InnoDBが実際にどれほど強力であるかについてのアイデア):

    • InnoDBを無効にすることができます-InnoDBを無効にする場合は、my.cnfファイルを変更し、[mysqld]セクションの下にskip-innodbを追加するだけです。その後、MySQLサーバーを再起動します-InnoDBが無効になっているはずです。または、-innodbオプションを使用することもできます。OFFに設定すると、エンジンが無効になります。ただし、これらのオプションはMySQL5.7.5で非推奨になっていることに注意してください。
    • InnoDBは、AUTO_INCREMENT列を持つテーブルに行を追加するSQLステートメントのパフォーマンスを向上させる構成可能なロックメカニズムも提供します。自動インクリメントモードは、innodb_autoinc_lock_modeオプションを使用して起動時に構成できます。このオプションには、ロックモードを指定するための3つの設定があります。ロックモードは、0(「従来型」)、1(「連続」)、または2(「インターリーブ」)のいずれかです。値は、データベース挿入のタイプに応じてパフォーマンスを提供します。要するに、0は古いバージョンのMySQLおよびInnodbとの互換性を提供します。値1は、ステートメントベースのレプリケーション(SBR)に対してより安全で決定論的なアプローチを提供します。値2はよりスケーラブルで最速のロックモードですが、特定のステートメントによって挿入された行は連続していない可能性があります。詳細については、MySQLのドキュメントを参照してください。
    • InnoDBを使用すると、バッファープールを複数のセグメントに分割できます(この機能はMySQL 5.5でのみ使用できます)。innodb_buffer_pool_instances設定を使用すると、複数のコアを実行するマシンでのMySQLのスケーラビリティを向上させることができます。デフォルトでは、この設定の値は、innodb_buffer_pool_sizeが1GB未満の場合は1、それ以外の場合は8です。数値は、InnoDBバッファープールが分割される領域の数を指定します。この設定を使用して、より多くのコアを使用できます。方法については後で説明します。
    • InnoDBは4つのトランザクション分離レベルを提供します(<5.7ではtx_isolation、バージョン5.7以降ではtransaction_isolation):READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE:これらの分離レベルはACIDの頭字語の「I」です。 :
      • READ UNCOMMITTEDが使用されている場合、あるトランザクションで別のトランザクションによるコミットされていない変更が表示されることがあります。この分離レベルにより、ダーティリードが可能になります。
      • READ COMMITTEDを使用している場合、読み取られたデータは、読み取られた時点でコミットされているので安心できます。
      • REPEATABLE READが使用されている場合、より高い分離レベルが使用されています。 READ COMMITTEDレベルによって保証されるすべてのものに加えて、すでに読み取られたデータが変更されないことも保証されます。
      • SERIALIZABLEが使用されている場合、さらに高い分離レベルが使用されます。 REPEATABLE READ分離レベルによって保証されるすべてのものに加えて、後続の読み取りで新しいデータが表示されないことも保証されます。
    • InnoDBでは、innodb_io_capacity変数を変更することにより、InnoDBで使用可能な全体的なI/O容量を定義することもできます。この変数の値は、システムが1秒あたりに実行できるIOPSのおよその数に設定する必要があります。このパラメーターの値を設定するときは、HDDには100前後の値が適切ですが、SSDはより高い値の恩恵を受ける可能性があることに注意してください。 。 innodb_io_capacity_max変数も役立ちます。この変数を使用すると、InnoDBをより積極的にフラッシュできます。つまり、I / O操作の速度がinnodb_io_capacityで定義された制限を超える可能性があります。このような状況では、操作はinnodb_io_capacity_max変数で定義された値を超えません。 。
    • InnoDBでは、I/O操作に使用できるバックグラウンドスレッドの数を制御することもできます。読み取り操作に割り当てられるI/Oスレッドの数は、innodb_read_io_threads変数によって制御できます。書き込み操作に割り当てられたOスレッドは、innodb_write_io_threads変数によって制御できます。これらのパラメータの両方のデフォルト値は4で、最大許容値は64です。
    • InnoDBには、特定のInnoDB警告をエラーに変換する機能があります。そのためには、innodb_strict_mode変数をONに設定するだけです。この変数は、CREATE TABLE、ALTER TABLE、およびCREATEINDEX操作の構文エラーの処理に影響します。 :この変数を無効にすると、「行サイズが大きすぎます」エラーが解決される場合があります。ストリクトモードを無効にするには、innodb_strict_modeをOFFに設定します。
    • InnoDBは、innodb_old_blocks_time変数を増やすことで、バッファープールにキャッシュされたデータに干渉する全表スキャンからある程度保護できます。この設定の最小値は0で、デフォルト値は1000です。
    • FULLTEXTインデックスを含むInnoDBテーブルでメンテナンス操作を実行する場合は、innodb_optimize_fulltext_only変数をONにすることを検討してください。この変数を有効にすると、データの再編成がスキップされるため、OPTIMIZETABLEクエリの実行速度が速くなります。テーブルで。この設定は一時的にのみ有効にすることを目的としているため、最適化が完了したらオフにすることをお勧めします。
    • InnoDBを読み取り専用モードで起動するには、innodb_read_only設定を有効にします。この設定を有効にすると、MySQLデータディレクトリが読み取り専用メディア上にあるInnoDBテーブルにクエリを実行できます。

    InnoDBをより多くのコアに関与させる

    マルチスレッド機能を利用して、InnoDBにさらに多くのコアを関与させることもできます。驚くべきことに、これを実現するのはそれほど難しくありません。いくつかの設定を変更するだけです。その方法は次のとおりです。

    1. innodb_thread_concurrencyオプションをデフォルト値0のままにします。そうすることで、InnoDBに、特定のMySQLに対して開く最適な同時実行チケットの数(同時にInnoDBに入ることができるスレッドの数を決定)を決定させます。インスタンスのセットアップ。 10.5以降のMariaDBの場合、非推奨としてマークされているため、MySQLの初期の頃と比較してコンピューティングリソースが高度化されているため、MySQLがこれを0に設定することは理にかなっています。
    2. innodb_thread_concurrencyオプションが0に設定されたら、innodb_read_io_threadsとinnodb_write_io_threadsの両方を最大値64に設定します。これにより、より多くのコアが関与するはずです。
    概要

    要約すると、InnoDBは非常に強力なストレージエンジンです。このストレージエンジンのパフォーマンスは、このエンジンが使用している設定によって直接影響を受けます。したがって、MySQLインスタンスのパフォーマンスを向上させたい場合は、この記事に記載されているヒントの少なくともいくつかを覚えておいてください。エンジンに関する設定を調整し、必要に応じて使用することで、メリットが得られるはずです。


    1. Oracle10gでピボット

    2. AndroidwithRoom-外部キーをnull許容に設定する方法

    3. MySQLで2つの列のパーセンテージを計算する方法

    4. SQLServerでのLIKEとCONTAINS