ホームページ  >  記事  >  データベース  >  SQL ステートメントの最適化戦略の概要

SQL ステートメントの最適化戦略の概要

王林
王林転載
2020-01-28 22:05:332268ブラウズ

SQL ステートメントの最適化戦略の概要

1. フル テーブル スキャンの回避#​​

##クエリを最適化するには、フル テーブル スキャンを回避してください。まず、Create の場所と順序を検討します。関連する列のインデックス。

2. null 値の判断を避ける

where 句内のフィールドの null 値の判断を避けるようにしてください。そうしないと、エンジンがインデックスの使用を断念します。

select id from t where num is null

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

select id from t where num=0

(無料の学習ビデオ チュートリアルの推奨事項: mysql ビデオ チュートリアル )

3. 不平等な価値判断を避ける

where 句 != または a8093152e673feb7aba1828c43532094 演算子での使用は避けてください。そうしないと、エンジンはインデックスの使用を断念し、テーブル全体のスキャンを実行します。

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 も注意して使用する必要があります。そうしないと、次のようなテーブル全体のスキャンが発生します。

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 '%abc%'

ファジー クエリが必要な条件の場合、「abc%」のような Select id from t where name を使用してファジー クエリを実装できます。この場合、インデックスが使用されます。ヘッダー照合が必要なロジックの場合は、全文検索エンジン (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'--name 以abc 开头的id

select id from t where name like 'abc%'

9 に変更する必要があります。WHERE の左側の


に注意してください。文中の「=」の左側では関数、算術演算、またはその他の式演算を実行しないでください。そうしないと、システムがインデックスを正しく使用できない可能性があります。

10. 複合インデックスの使用

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

11. 異議のないクエリを定義しないでください。

無意味なクエリを作成しないでください。たとえば、空のテーブル構造を生成する必要がある場合:

select col1,col2 into #t from t where 1=0

このタイプのコード結果セットはシステム リソースを消費しますが、

create table #t(...)

12 に変更する必要があります。多くの場合、exists


選択する:

select num from a where num in(select num from b)

次のステートメントに置き換えます:

select num from a where exists(select 1 from b where num=a.num)

13. インデックスも失敗する可能性があります

并不是所有索引对查询都有效,SQL 是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL 查询可能不会去利用索引,如一表中有字段sex,male、female 几乎各一半,那么即使在sex 上建了索引也对查询效率起不了作用。

14、表格字段类型选择

尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。

这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。尽可能的使用varchar 代替char ,因为首先可变长度字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

15、查询语法中的字段

任何地方都不要使用select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

16、索引无关优化

不使用*、尽量不使用union,union all 等关键字、尽量不使用or 关键字、尽量使用等值判断。表连接建议不超过5 个。如果超过5 个,则考虑表格的设计。(互联网应用中)表连接方式使用外联优于内联。外连接有基础数据存在。

如:A left join B,基础数据是A。A inner join B,没有基础数据的,先使用笛卡尔积完成全连接,在根据连接条件得到内连接结果集。

大数据量级的表格做分页查询时,如果页码数量过大,则使用子查询配合完成分页逻辑。

Select * from table limit 1000000, 10
Select * from table where id in (select pk from table limit100000, 10)

相关文章教程推荐:mysql教程

以上がSQL ステートメントの最適化戦略の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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