私を行かせてください、これらの2つの小さなトリックは私のSQLステートメントを隠すだけでなく、それを1000倍改善します(30分の乾物シリーズ)

私を行かせてください、これらの2つの小さなトリックは私のSQLステートメントを隠すだけでなく、それを1000倍改善します(30分の乾物シリーズ)

今回は、SQLクエリに関連する2つの小さな知識ポイントについて説明します。これらの知識ポイントを習得すると、落とし穴を踏むことを避け、クエリの効率を向上させることができます。

1.フィールドの値をnullにできるようにします。これは、多くの場合、災害につながります。

まず、最初にいくつかのデータを準備し、後でデモンストレーションします

create table animal(
id int,
name char(20),
index(id)
)engine=innodb;

index(id)は、idフィールドのインデックスを作成することを意味し、idとnameの両方をnullにすることができます。

次に、4つのデータを挿入します。最後のデータのIDはです。

insert into animal(id, name) values(1, '猫');
insert into animal(id, name) values(2, '狗');
insert into animal(id, name) values(3, '猪');
insert into animal(id, name) values(null, '无名动物');

(注:コードブロックは左右に引っ張ることができます)

この時点でのテーブルのデータは
私を行かせてください、これらの2つの小さなトリックは私のSQLステートメントを隠すだけでなく、それを1000倍改善します(30分の乾物シリーズ)

このとき、IDが!= 1の動物をテーブルに照会します。

select * from animal where id != 1;

結果は次のとおりです。

私を行かせてください、これらの2つの小さなトリックは私のSQLステートメントを隠すだけでなく、それを1000倍改善します(30分の乾物シリーズ)
現時点では、2行のデータ(原則として3行)しか見つかりませんでしたが、id = nullの行は一致しませんでした。null
は他の値と等しくないと聞いたことがあるかもしれません。nullであることが合理的です!= 1は真ですが、現実は残酷であり、一致しません。

したがって、フィールドの値をnullにしないでください。そうしないと、期待に沿わない結果が生じる可能性があります。

とにかく、私は以前にこのピットを踏んだことがあります、あなたがそれを踏んだかどうかわかりませんか?

しかし、誰かがnull値を設定した場合はどうなりますか?この場合、!=の検索では、後でorまたはid is null句を追加できます(id = nullは値がnullの行と一致しないため、= nullではなくnullであることに注意してください)。これは

select * from animal where id != 1 or id is null;

結果は次のとおりです。
私を行かせてください、これらの2つの小さなトリックは私のSQLステートメントを隠すだけでなく、それを1000倍改善します(30分の乾物シリーズ)

2.代わりに、または可能な限りユニオンを使用します

(1)ちょうど今、idフィールドのインデックスを作成しました。同等の操作を実行する場合は、通常、インデックス操作を実行します。信じられない場合は、以下を参照してください。

explain select * from animal where id = 1;

結果は次のとおりです。
私を行かせてください、これらの2つの小さなトリックは私のSQLステートメントを隠すだけでなく、それを1000倍改善します(30分の乾物シリーズ)

実行計画からわかるように、idでの同等の検索にインデックスを付けることができます(予想どおりに推定されます)。

type = ref:一意でないインデックス
行= 1:予測スキャン1行

(2)idがnullの場合、インデックスは使用されますか?図に示すように、答えはイエスです。

explain select * from animal where id is null;

私を行かせてください、これらの2つの小さなトリックは私のSQLステートメントを隠すだけでなく、それを1000倍改善します(30分の乾物シリーズ)
それらの中で
type = ref:非一意のインデックス
行= 1:1つの行をスキャンすることを予測します

(3)つまり、id = 1またはid = nullの動物を見つけたい場合は、orステートメントを使用して接続できます。

select * from animal where id = 1 or id is null;

このステートメントにはインデックスが付けられますか?

インデックスを使用するかどうかは、図のように実行計画を確認できます。

explain select * from animal where id = 1 or id is null;

私を行かせてください、これらの2つの小さなトリックは私のSQLステートメントを隠すだけでなく、それを1000倍改善します(30分の乾物シリーズ)
その中で:

ref = ALL:テーブル全体のスキャンを意味します

行= 4:4行をスキャンすると予測します(テーブル全体には4行しかありません)

実行計画から、インデックスを使用する、または取得しない可能性が非常に高いことがわかります。これにより、クエリレートが大幅に低下するため、条件を接続するためにor句を使用することは一般に推奨されません。

それで、それをどのように解決するのですか?

実際、ユニオンは次のように、またはを置き換えるために使用できます。

select * from animal where id = 1 union select * from animal where id is null.

私を行かせてください、これらの2つの小さなトリックは私のSQLステートメントを隠すだけでなく、それを1000倍改善します(30分の乾物シリーズ)
この時点で、インデックスを2回調べて、id = 1およびすべてのid = nullのすべての行を検索し、一時テーブルを使用して最終結果を格納し、最後に一時テーブルをスキャンします。

3.まとめ

1.テーブルを定義するときは、フィールド値がnullにならないようにしてください。デフォルトを使用して、デフォルト値を設定できます。

2.インデックスを付けずにクエリを回避するために、またはの代わりにユニオンを使用するようにしてください。

3. id = nullの同等のクエリは、値がnullの行と一致しないことに注意してください。代わりに、idがnullの行を使用する必要があります。

踏んだ穴についてもお話しいただけます。

あなたは好きかもしれません
1.Tencentインタビュー:SQLステートメントが非常に遅く実行される理由は何ですか?---後悔シリーズ
2をないでください。なぜあなたは再帰を学ぶことができないのですか?再帰に別れを告げて、私の経験のいくつかについて話して
ください
。3 。コンピューターが別のコンピューターにデータを送信する方法を理解するための記事。4 わずか2GBのメモリで200/400億/ 800億の整数から最も頻繁に発生するものを見つける方法番号
5.文字列マッチングBoyer-Mooreアルゴリズム:テキストエディタの検索機能はどのように実装されていますか?
私を行かせてください、これらの2つの小さなトリックは私のSQLステートメントを隠すだけでなく、それを1000倍改善します(30分の乾物シリーズ)

おすすめ

転載: blog.51cto.com/15015171/2554965
おすすめ