このセクションでは、InnoDB
テーブルを使用する場合のベストプラクティスについて説明します。
最も頻繁にクエリーするカラムを使用してすべてのテーブルに primary key を指定するか、明らかな主キーがない場合は auto-increment 値を指定します。
これらのテーブルの同一の ID 値に基づいて複数のテーブルからデータが取得される場合は、joins を使用します。 結合のパフォーマンスを高速にするには、結合カラム上に外部キーを定義し、各テーブル内でそれらのカラムを同じデータ型で宣言します。 外部キーを追加すると、参照カラムが確実にインデックス付けされ、パフォーマンスを向上させることができます。 また、外部キーは、影響を受けるすべてのテーブルに削除または更新を伝播し、対応する ID が親テーブルに存在しない場合に子テーブルへのデータの挿入を防止します。
autocommit をオフにします。 1 秒間に何百回もコミットすると、パフォーマンスに上限が設定されます (これは、ストレージデバイスの書き込み速度で制限されます)。
関連する DML 操作のセットを、
START TRANSACTION
およびCOMMIT
ステートメントでカッコで囲んで transactions にグループ化します。 頻繁にはコミットしたくない一方で、コミットなしで何時間も実行されるINSERT
、UPDATE
、または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 TABLE
のENGINE=
句で指定されたエンジンに問題がある場合に、別のストレージエンジンでテーブルが作成されないようにします。