単一列インデックスまたは結合インデックスに関係なく、インデックスは独立した B インデックス ツリーに対応します。インデックス ツリー ノードには次のもののみが含まれます:
インデックス内のフィールド値
主キーの値
必要なデータが見つかった場合でもインデックスツリーに従った条件によると、インデックス内のいくつかのフィールドの値と主キーの値だけですが、select *
をすると他にもありますフィールドを検索するには、テーブルに戻って主キーに基づいてクラスター化インデックスでフィールドを探す必要があります。クラスター化インデックスのリーフ ノードはデータ ページです。データ ページを見つけることによってのみ、すべてのフィールド値を確認できます。のデータ行が読み取られます。
したがって、これは
select * from table order by xx1,xx2,xx3
と似ています。結合インデックスのインデックス ツリーからすべてのデータを順番に取得し、各データに対して主キーのクラスタード インデックス検索を実行する必要があります。あまりパフォーマンスがよくありません。
時々 MySQL
実行エンジンは、
select * from table order by xx1,xx2,xx3
のような場合、結合インデックスとクラスター化インデックス (両方のインデックス) のすべてのデータをスキャンすることと同等であると考えるかもしれません。結合インデックスを使用する代わりに、テーブル全体を直接スキャンできるため、スキャンする必要があるのは 1 つの主キー インデックスだけです。
しかし、形状が次のような場合:
select * from table order by xx1,xx2,xx3 limit 10
実行エンジンは、最初にジョイント インデックスのインデックス ツリーをスキャンし、10 個のデータを取得し、次に、クラスター化インデックスで 10 回検索するだけで 10 個のデータを比較します。その後も結合インデックスが使用されます。
カバー インデックスはインデックスではなく、インデックス クエリに基づく単なるメソッドです。つまり、## のような場合に必要なのは、結合インデックス内のいくつかのフィールドだけです。 #
select xx1,xx2,xx3 from table order by xx1,xx2,xx3
したがって、ジョイント インデックスを使用する場合は、クラスタ化インデックスに大量のテーブルが返される可能性があることに注意してください。テーブルをクラスタ化インデックスに返す回数が多すぎると、ジョイントインデックスを使用せずにテーブル全体を直接スキャンすることもできます。
可能であれば、乱暴に
select * を使用するのではなく、SQL で必要なフィールドのみを指定してください。カバーするインデックスに直接移動することをお勧めします。
テーブルを返すことが避けられない場合でも、
limit と
where を使用してテーブルが返される数を制限し、少数のテーブルをフィルタリングするように最善を尽くしてください。結合インデックスからデータを取得してからテーブルを返すため、パフォーマンスが向上します。
以上がMySQL テーブルの戻りのパフォーマンス消費はどのくらいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。