ホームページ  >  記事  >  データベース  >  MySQL テーブルの戻りのパフォーマンス消費はどのくらいですか?

MySQL テーブルの戻りのパフォーマンス消費はどのくらいですか?

王林
王林転載
2023-05-26 19:34:21745ブラウズ

1 テーブル リターンのパフォーマンス消費

単一列インデックスまたは結合インデックスに関係なく、インデックスは独立した 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 個のデータを比較します。その後も結合インデックスが使用されます。

2 カバー インデックス

カバー インデックスはインデックスではなく、インデックス クエリに基づく単なるメソッドです。つまり、## のような場合に必要なのは、結合インデックス内のいくつかのフィールドだけです。 #

select xx1,xx2,xx3 from table order by xx1,xx2,xx3

値を指定した場合、他のフィールドを見つけるためにテーブルに戻ることなく、結合インデックスのインデックス ツリーをスキャンするだけで済みます。このクエリ メソッドはカバー インデックスです。

したがって、ジョイント インデックスを使用する場合は、クラスタ化インデックスに大量のテーブルが返される可能性があることに注意してください。テーブルをクラスタ化インデックスに返す回数が多すぎると、ジョイントインデックスを使用せずにテーブル全体を直接スキャンすることもできます。
可能であれば、乱暴に
select * を使用するのではなく、SQL で必要なフィールドのみを指定してください。カバーするインデックスに直接移動することをお勧めします。 テーブルを返すことが避けられない場合でも、
limitwhere を使用してテーブルが返される数を制限し、少数のテーブルをフィルタリングするように最善を尽くしてください。結合インデックスからデータを取得してからテーブルを返すため、パフォーマンスが向上します。

以上がMySQL テーブルの戻りのパフォーマンス消費はどのくらいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。