今回は、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, '无名动物');
(注:コードブロックは左右に引っ張ることができます)
この時点でのテーブルのデータは
このとき、IDが!= 1の動物をテーブルに照会します。
select * from animal where id != 1;
結果は次のとおりです。
現時点では、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.代わりに、または可能な限りユニオンを使用します
(1)ちょうど今、idフィールドのインデックスを作成しました。同等の操作を実行する場合は、通常、インデックス操作を実行します。信じられない場合は、以下を参照してください。
explain select * from animal where id = 1;
結果は次のとおりです。
実行計画からわかるように、idでの同等の検索にインデックスを付けることができます(予想どおりに推定されます)。
type = ref:一意でないインデックス
行= 1:予測スキャン1行
(2)idがnullの場合、インデックスは使用されますか?図に示すように、答えはイエスです。
explain select * from animal where id is null;
それらの中で
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;
その中で:
ref = ALL:テーブル全体のスキャンを意味します
行= 4:4行をスキャンすると予測します(テーブル全体には4行しかありません)
実行計画から、インデックスを使用する、または取得しない可能性が非常に高いことがわかります。これにより、クエリレートが大幅に低下するため、条件を接続するためにor句を使用することは一般に推奨されません。
それで、それをどのように解決するのですか?
実際、ユニオンは次のように、またはを置き換えるために使用できます。
select * from animal where id = 1 union select * from animal where id is null.
この時点で、インデックスを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アルゴリズム:テキストエディタの検索機能はどのように実装されていますか?