MySQL:3つのフィールドの複合インデックスを作成するか、3つの個別のインデックスを作成しますか?
-
11-10-2019 - |
質問
他の属性の中でも、タイムスタンプ、タイプ、およびuser_idを備えたMySQLテーブルがあります。
それらはすべて検索可能であり、/またはソート可能です。
それぞれのインデックスを作成するか、3つすべてまたはその両方で単一の複合インデックスを作成することをお勧めしますか?
解決
Pabloの答えは正しいですが、複合指数が正当化される可能性があることに気付かないかもしれません。
複数のインデックスを持つことができます idx1(tstamp, user_id)
持っていることからあなたを除外しません indx2(tstamp, type)
また idx1reverse(user_id, tstamp)
等々...
複合インデックスは、クエリのすべての条件をカバーする場合に最も役立つため、提案するインデックスは最も役立ちます
SELECT * FROM my_table WHERE tstamp = @ts1 AND user_id = @uid AND type = @type
このようなクエリのパフォーマンスを改善したい場合は、複合インデックスの追加を検討できます。
インデックスの欠点は、すべての更新操作が遅くなることです。ただし、ほとんどの一般的なアプリケーションは、更新よりも多くの選択を行います(トランザクションの数、特に影響を受ける/取得したレコードの観点から)と同時に、より遅い更新に対してはるかに寛容です(ユーザーは主に速度を判断しますシステムは、レコードを更新する必要がある時期ではなく、レコードを取得するのに必要な時までにYMMVと、そのようなルールで再生されないアプリケーションがあります)。
最適なのは、典型的なワークロード(いくつかの典型的なSQLスクリプトを作成し、独立して繰り返し可能な、またはアプリケーションレベルで単体テストを作成する)の観点からデータベースのパフォーマンスをテストする方法がある場合に、データベースを客観的に調整できます。
編集また、機能の観点からシステムに影響を与えることなく、インデックスを追加およびドロップできることを認識してください。したがって、システムの実際の使用中にインデックスを後でチューニングすることができます。通常、インデックスを追加することで利益を得ることができる条件を探している遅いSQLクエリを収集してプロファイルします。
他のヒント
これらのフィールドで個別に検索を実行する場合は、クエリをより速く実行するために個別のインデックスが必要になるでしょう。
このようなインデックスがある場合:
mysql> create index my_idx on my_table(tstamp, user_id, type);
そして、あなたはクエリです:
mysql> select * from my_table where type = 'A';
それで my_idx
クエリにはあまり役に立ちません。MySQLは、それを解決するために完全なテーブルスキャンを行うことになります。