MySQL は、広く使用されているリレーショナル データベース管理システムです。開発中、インデックスによってクエリの効率が向上しますが、場合によってはインデックスの障害が発生し、クエリの速度が低下したり、インデックスが使用できなくなったりすることがあります。
この記事では、インデックス障害の原因、インデックス障害の検出方法、インデックスの最適化方法、および実際の事例を紹介します。
1. インデックスが失敗する理由
例: SELECT * FROM user WHERE DATE_FORMAT(create_time, '%Y -%m-%d')='2021-01-01';
解決策: 関数の演算結果を一時テーブルまたは新しいテーブルに保存してからクエリを実行します。
例: SELECT * FROM user WHERE create_time='2021-01-01';
create_time フィールドの場合が日時型で、クエリ条件が文字型の場合、インデックスが失敗します。
解決策: クエリ条件のタイプとインデックス列のタイプの一貫性を保ちます。
例: SELECT * FROM user WHERE create_time INTERVAL 1 DAY > NOW();
解決策 :インデックス列で演算子を使用することは避けてください。最初に演算結果を計算してからクエリを実行できます。
例: SELECT * FROM user WHERE create_time IS NULL;
解決策:ジョイント インデックスを使用するか、クエリ ステートメントを変更してください。
例: 数百万のデータを含むテーブルの場合、特定のデータの 90% がフィールドが等しい。現時点では、このフィールドを使用するクエリは失敗します。
解決策: ジョイント インデックスを使用するか、カバーリング インデックスを使用します。
例: SELECT * FROM user WHERE name LIKE '�c%';
解決策: を使用します。フルテキスト インデックスまたはクエリ条件を変更します。
2. インデックスの失敗を検出する方法
EXPLAIN キーワードを使用してクエリ ステートメントの実行プランを表示できます。
例: EXPLAIN SELECT * FROM user WHERE create_time='2021-01-01';
クエリ結果に「Using where」が表示される場合は、インデックスが無効であり、インデックスが無効であることを意味します。最適化される。
3. インデックスを最適化する方法
ジョイント インデックスとは、複数の列で構成されるインデックスを指します。クエリ効率。
例: CREATE INDEX idx_user ON user(create_time, name);
クエリの順序を考慮する必要があります。たとえば、上記のステートメントでは、create_time が最初の列と名前です。は 2 番目の列です。このインデックスを使用するには、クエリ条件に Create_time が存在する必要があります。
カバー インデックスとは、クエリの結果をデータ テーブルからではなくインデックスからのみ取得する必要があることを意味します。
例: CREATE INDEX idx_user ON user(create_time) INCLUDE(name);
含める必要がある列を明確に指定する必要があります。クエリを実行する場合は、クエリを取得するだけで済みます。データテーブルへのアクセス数を削減し、クエリ効率を向上させることができます。
フルテキスト インデックスは、テキスト検索シナリオに適した特別なインデックスです。
例: CREATE FULLTEXT INDEX idx_user ON user(name);
MySQL は英語と中国語のフルテキスト インデックスのみをサポートし、他の言語では 3 番目のインデックスを使用する必要があることに注意してください。 -パーティープラグイン。
4. 実際のケース
あるシステムには、数百万のデータを含むユーザー テーブル user があります。これにはフィールド名があり、ユーザーのクエリに使用されます。
当初、フィールドにはインデックスがなく、クエリ速度が非常に遅かったです。その後、このフィールドにインデックスが追加され、クエリ速度が大幅に向上しました。
しかし、システムが一定期間オンラインになった後、クエリ速度が再び低下し、次のような多くのレコードがアクセス ログに記録されることが判明しました:
SELECT * FROM user WHERE name LIKE '�c% ';
EXPLAIN キーワードを使用して実行プランを表示すると、インデックスが無効で最適化が必要であることがわかります。
最後の解決策は、フィールドのフルテキスト インデックスを作成し、クエリ ステートメントを変更することです。変更されたクエリ ステートメントは次のとおりです。
SELECT * FROM user WHERE MATCH(name) AGAINST('abc');
あるシステムには、数百万のデータを含む注文テーブル order があり、注文のクエリに使用されるフィールド create_time があります。
当初、フィールドにはインデックスが付けられており、クエリ速度は許容範囲内でした。ただし、注文数が増加するにつれて、クエリの実行時間は徐々に長くなり、一部のクエリがタイムアウトすることもあります。
EXPLAIN キーワードを使用して実行計画を確認すると、インデックスが無効であり、最適化する必要があることがわかります。
最後の解決策は、フィールドの結合インデックスを作成し、クエリ ステートメントを変更することです。変更されたクエリ ステートメントは次のとおりです:
SELECT * FROM order WHERE create_time='2021-01-01' AND status='SUCCESS';
要約すると、インデックスはクエリを改善するためのものです。効率は重要ですが、実際の使用ではインデックスの失敗を回避する必要があります。インデックスを検出して最適化することで、クエリ効率が向上し、最適なデータベース パフォーマンスを実現できます。
以上がmysql > インデックスの失敗の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。