検索
ホームページデータベースmysql チュートリアルmysql は SQL 最適化をどのように実行しますか?

Mysql SQL 最適化方法: 1. フル テーブル スキャンを回避し、where および order by に関係する列にインデックスを作成します; 2. where 句内のフィールドの null 値判定を回避し、「 != 」または「 」の使用を回避します。 「」演算子、条件を接続するために 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 までご連絡ください。
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

带你把MySQL索引吃透了带你把MySQL索引吃透了Apr 22, 2022 am 11:48 AM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境