👍

【Laravel10、MySQL8.0】データベース構造の最適化:インデックス追加編

2024/04/01に公開

インデックス追加

データベース構造の最適化の第一歩。インデックス追加です。XX_idとついていて、処理が遅い検索などがあればindexをつける。

結果:性能比較

例)5,000件x5,000件という組み合わせのデータの組み合わせの場合
indexなし:20秒
indexあり:5秒
といった性能改善が見られる。
これは、いろいろな条件(データの順序、キャッシュの有無)などで変化するため、一概に4倍早くなる、ということではない。

注意点

影響範囲

全ての検索カラムにindexをつければ良い、というわけではない。ユニークであるなど効率よく検索されるカラムに対して付与すると効果的。
また、追加や削除処理が遅くなるので、件数を指定して大量に追加したり、一括削除するような処理が並列処理でない場合、タイムアウトする危険性も増すため、処理内容や性能により、限界値の減らすなども必要になる
またDBのディスクスペースの使用量も増えるため、大量データにindexをつけるときは注意する

インデックスの長さ制限

インデックスにはカラム名の長さに制限があるので下記のように工夫する。

オリジナルの名称で、indexを付与

$table->index('hogehoge_long_name_item_content_id', 'hoge_short_name_item_content_id_index');

オリジナルの名称のindexを削除

$table->dropIndex('hoge_short_name_item_content_id_index');

全体

LongNameAddIndex.php
/**
 * Run the migrations.
 */
public function up(): void
{
    Schema::table('hogehoge_long_name_item_content_exclusive_patterns', function (Blueprint $table) {
        $table->index('hogehoge_long_name_item_content_id', 'hoge_short_name_item_content_id_index');
        $table->index('hogehoge_long_name_pattern_id', 'hoge_short_name_pattern_id_index');
    });
}

/**
 * Reverse the migrations.
 */
public function down(): void
{
    Schema::table('hogehoge_long_name_item_content_exclusive_patterns', function (Blueprint $table) {
        $table->dropIndex('hoge_short_name_item_content_id_index');
        $table->dropIndex('hoge_short_name_pattern_id_index');
    });
}

downの動作チェック

マイグレーションで怠っていけないのがdownのチェック。
php artisan migrate:rollback
を行って、必ず動作が問題ないことを確認する。

Discussion