ホームページ  >  記事  >  データベース  >  mysql は SQL 最適化をどのように実行しますか?

mysql は SQL 最適化をどのように実行しますか?

青灯夜游
青灯夜游オリジナル
2020-09-27 17:37:2710484ブラウズ

Mysql SQL 最適化方法: 1. フル テーブル スキャンを回避し、where および order by に関係する列にインデックスを作成します; 2. where 句内のフィールドの null 値判定を回避し、「 != 」または「 」の使用を回避します。 「a8093152e673feb7aba1828c43532094」演算子、条件を接続するために or を使用することは避けてください。3. in で使用する場合と in で使用しない場合は注意してください。

mysql は SQL 最適化をどのように実行しますか?

# MySQL での一般的な SQL 最適化戦略

1 フル テーブル スキャンを避ける

クエリを最適化するには、テーブル全体のスキャンを避けるようにしてください。まず、where と order by に関係する列にインデックスを作成することを検討してください。

2 null 値の判断を避ける
where 句内のフィールドの null 値の判断を避けるようにしてください。そうしないと、エンジンが使用を中止します。テーブル全体のスキャン (例:

select id from t where num is null

) num にデフォルト値 0 を設定して、テーブルの num 列に null 値がないことを確認してからクエリを実行できます。次のように:

select id from t where num=0

3 不等価の判断を避ける

!= または < の使用は避けてください。 where 句に ;> 演算子を使用しないと、エンジンはインデックスの使用を放棄し、テーブル全体のスキャンを実行します。

4 or ロジックの使用を避ける
条件を接続するために where 句で or を使用することは避けるようにしてください。そうしないと、エンジンがインデックスの使用を放棄し、次のようなテーブル全体のスキャンを実行します。

select id from t where num=10 or num=20

次のようにクエリできます。

select id from t where num=10
union all
select id from t where num=20

5 ロジックで in と not in を使用する場合は注意が必要です
in と not in を使用する場合も注意が必要です。そうしないと、次のようなテーブル全体のスキャンが発生します。
select id from t1 where num in(select id from t2 where id > 10)
このとき、外部クエリはインデックスを使用せずにテーブル全体をスキャンします。これは次のように変更できます:
select id from t1,(select id from t1 where id > 10)t2 where t1.id = t2.id
現時点ではインデックスが使用されており、これにより大幅に改善される可能性があります。クエリ効率。

6 ファジー クエリに注意してください
次のクエリでもテーブル全体のスキャンが発生します:
select id from t where name like '�c%'
ファジー クエリが必須条件の場合、select id from t where name like 'abc%' を使用してファジー クエリを実装でき、インデックスが使用されます。ヘッダー照合が必要なロジックの場合は、全文検索エンジン (Elastic search、Lucene、Solr など) を使用することをお勧めします。

#7 クエリ条件でのフィールド計算の回避#​​##where 句内のフィールドに対する式操作の実行は避けるようにしてください。エンジンがインデックスの使用を断念し、テーブル全体のスキャンを実行します。例: select id from t where num/2=100
を次のように変更する必要があります:
select id from t where num=100*2

# 8. クエリ条件内のフィールドに対する関数演算の実行を避けるwhere 句内のフィールドに対する関数演算の実行は避けてください。エンジンがインデックスの使用を断念する原因になります。そしてテーブル全体のスキャンを実行します。例: select id from t where substring(name,1,3)='abc'--名前が abc で始まる ID を次のように変更する必要があります:
select id from t where name like ' abc% '


9 WHERE 句の「=」の左側に注意してください次の場合は行わないでくださいwhere 句の関数、算術演算、またはその他の式演算の「=」の左側を指定しないと、システムがインデックスを正しく使用できない可能性があります。

10 複合インデックスの使用インデックス フィールドを条件として使用する場合、インデックスが複合インデックスの場合は、インデックスの最初のフィールドが条件として使用される場合にのみ、システムはインデックスを使用できます。それ以外の場合、インデックスは使用されず、フィールドの順序は可能な限りインデックスの順序と一致する必要があります。

11 不快なクエリを定義しないでください無意味なクエリを作成しないでください。たとえば、空のテーブル構造を生成する必要があります。 : selectcol1,col2 into #t from t where 1=0 このタイプのコードは結果セットを返しませんが、システム リソースを消費します。これを次のように変更する必要があります:
create table #t(. ..)


12 assigns多くの場合、次の中での代わりに、exists を使用することをお勧めします。 select num from a where num in(select num from b)次のステートメントに置き換えます:
select num from a where names(select 1 from b where num=a.num)

13 インデックスも失敗する可能性があります
すべてのインデックスがクエリに有効であるわけではありません。SQL はテーブル内のデータに基づいてクエリを最適化します。インデックス列に大量の重複データがある場合、SQL クエリはインデックスを使用できない可能性があります。たとえば、テーブルに性別フィールドがあり、ほぼ半数が男性、半数が女性である場合、インデックスが構築されていても、性別に関しては、クエリの効率には影響しません。

14 テーブル フィールド タイプの選択
数値フィールドを使用してみてください。フィールドに数値情報のみが含まれている場合は、デザインを避けてください。これはクエリと結合のパフォーマンスを低下させ、ストレージのオーバーヘッドを増加させます。これは、エンジンがクエリと接続を処理するときに文字列内の各文字を 1 つずつ比較し、数値型の場合は 1 回の比較だけで十分であるためです。
可変長フィールドはストレージ スペースが小さく、ストレージ スペースを節約できるため、できる限り char ではなく varchar を使用してください。次に、クエリの場合、比較的小さなフィールドの検索効率が明らかに高くなります。

15 クエリ構文のフィールド

どこでも select * from t を使用せず、" * の代わりに特定のフィールド リストを使用してください。 "、使用されていないフィールドは返されません。

16 インデックスに依存しない最適化

* は使用しないでください。union、union all、その他のキーワードは使用しないでください。試してみてください。または キーワードを使用しないでください。同等の判断を下すようにしてください。

テーブル接続の数は 5 を超えないようにすることをお勧めします。 5 つを超える場合は、テーブルのデザインを考慮してください。 (インターネット アプリケーションの場合)


テーブル接続方法では、インライン リンクよりも外部リンクの方が適しています。
基本データは外部接続に存在します。例: A は B を結合し、基本データは A です。

A 内部結合 B、基本データがない場合は、最初にデカルト積を使用して完全結合を完了し、次に接続条件に従って内部結合結果セットを取得します。


大規模なデータ レベルのテーブルに対してページング クエリを実行する場合、ページ番号の数が大きすぎる場合は、サブクエリを使用してページング ロジックを完成させます。
Select * from table limit 1000000, 10

Select * from table where id in (select pk from table limit 100000, 10)###

以上がmysql は SQL 最適化をどのように実行しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。