表に戻るクエリの説明

1814 ワード

回表という言葉を聞いたことがないかもしれませんが、実際の仕事では必ず回表を使ったことがあります.もしまだ時計を聞いたことがないならば、私はあなたがどれだけSQLの最適化の知識を見ても、まだ表面にとどまっていると信じています.私の前のこの文章「MySQLパフォーマンス最適化神器Explain使用チュートリアル」を参考に勉強したことがあるとしても.
SQL文のクエリー・プロシージャ
まず、時計を見てみましょう.
一般的には、インデックスのカラムがselectで取得するカラム(mysqlでインデックスがインデックスカラムの値に基づいてソートされるため、インデックスノードにそのカラムの一部の値が存在する)またはインデックスクエリに基づいてレコードを取得するにはテーブルに戻る必要はありません.selectが取得するカラムにインデックス以外のカラムが大量にある場合、インデックスは、テーブルに適切なカラムの情報を見つける必要があります.これをテーブルに戻します.
この概念によると、Explainを使用してクエリー計画を実行すると、結果にExtraがusing index、using where、using index conditionなどが現れた場合、フィルタ条件を使用し、インデックスを使用し、SQLを最適化するのは悪くないと思います.これは実は誤った認識である.
インデックスが使用されているからといって、クエリが最適であるわけではありません.USing index condition、using index&using whereなどから分かるように、このSQL文は実は表に戻ったものです.
また、Explainの実行計画を見て、インデックスを外したのになぜ遅いのかを発見することもあります.この中には時計があるかもしれません.次に、リターンテーブルとは何かを例に挙げて説明します.まずテーブルを作成します.sql文は次のとおりです.
create table xttblog(
    id int primary key, 
    k int not null, 
    name varchar(16),
    index (k)
)engine = InnoDB;

次に、次のSQL文を実行し、いくつかのテストデータを挿入します.
INSERT INTO xttblog(id, k, name) VALUES(1, 2, 'xttblog'),
    (2, 1, '   '),
    (3, 3, '      ');

仮に、idが2のデータを検索します.ではselect*from xttblog where ID=2を実行します.このSQL文はテーブルに戻る必要はありません.なぜなら、プライマリ・キーのクエリー方式によっては、IDというB+ツリーを検索するだけです.プライマリ・キーは一意で、この一意のインデックスに基づいてMySQLは検索のレコードを特定できます.
ただし、kというインデックスを使用してk=2のレコードをクエリーする場合は、テーブルに戻ります.select * from xttblog where k = 2; なぜなら、kという一般的なインデックスクエリ方式では、まずkインデックスツリーを検索し、その後、プライマリキーIDの値が1となり、IDインデックスツリーに1回検索する必要があるからです.このプロシージャはインデックスを使用しますが、実際には下位レベルでインデックスクエリが2回行われ、このプロシージャをリターンテーブルと呼びます.
つまり、プライマリ・キー以外のインデックスに基づいたクエリは、インデックス・ツリーを複数スキャンする必要があります.したがって、アプリケーションでは、プライマリ・キー・クエリーをできるだけ使用する必要があります.
ここでは表のデータ量が少ないので、データ量が大きいと、2回のクエリにかかる時間が明らかになり、プライマリ・キーを使用したクエリの効率が高いことが明らかになります.