MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  InnoDB テーブルのベストプラクティス

15.1.2 InnoDB テーブルのベストプラクティス

このセクションでは、InnoDB テーブルを使用する場合のベストプラクティスについて説明します。

  • 最も頻繁にクエリーするカラムを使用してすべてのテーブルに primary key を指定するか、明らかな主キーがない場合は auto-increment 値を指定します。

  • これらのテーブルの同一の ID 値に基づいて複数のテーブルからデータが取得される場合は、joins を使用します。 結合のパフォーマンスを高速にするには、結合カラム上に外部キーを定義し、各テーブル内でそれらのカラムを同じデータ型で宣言します。 外部キーを追加すると、参照カラムが確実にインデックス付けされ、パフォーマンスを向上させることができます。 また、外部キーは、影響を受けるすべてのテーブルに削除または更新を伝播し、対応する ID が親テーブルに存在しない場合に子テーブルへのデータの挿入を防止します。

  • autocommit をオフにします。 1 秒間に何百回もコミットすると、パフォーマンスに上限が設定されます (これは、ストレージデバイスの書き込み速度で制限されます)。

  • 関連する DML 操作のセットを、START TRANSACTION および COMMIT ステートメントでカッコで囲んで transactions にグループ化します。 頻繁にはコミットしたくない一方で、コミットなしで何時間も実行される INSERTUPDATE、または DELETE ステートメントの巨大なバッチも発生させたくありません。

  • LOCK TABLES ステートメントを使用しません。 InnoDB は、一度に同じテーブルへのすべての読み取りおよび書き込みを行うことで、信頼性や高パフォーマンスを犠牲にせずに、複数のセッションを処理できます。 行のセットへの排他的な書き込みアクセス権を取得するには、SELECT ... FOR UPDATE という構文を使用して、更新対象の行のみをロックします。

  • innodb_file_per_table オプションを有効にするか、一般的なテーブルスペースを使用して、テーブルのデータおよびインデックスを system tablespace ではなく別々のファイルに配置します。

    innodb_file_per_table オプションはデフォルトで有効になっています。

  • データおよびアクセスパターンが InnoDB のテーブルまたはページの compression 機能を利用できるかどうかを評価します。 読み取りおよび書き込みの機能を犠牲にせずに、InnoDB テーブルを圧縮できます。

  • オプション --sql_mode=NO_ENGINE_SUBSTITUTION を指定してサーバーを実行し、CREATE TABLEENGINE= 句で指定されたエンジンに問題がある場合に、別のストレージエンジンでテーブルが作成されないようにします。


関連キーワード:  InnoDB, テーブル, 構成, 圧縮, インデックス, スペース, ロック, パフォーマンス, INFORMATION, SCHEMA