目次
1. はじめに
2. SQL ステートメントのインターセプト
3. クエリ最適化のための基本的な分析コマンド
4. クエリ最適化のためのいくつかの方向性
5. インデックスの最適化
5.1. インデックスの利点:
5.2. インデックスのデメリット
5.3. インデックスの選択
5.4. インデックスの詳細な検討
6. サブクエリの最適化
7. 同等の述語の書き換え:
8. 条件の単純化と最適化
6. 恒等変換と不等式変換。例: 数百万のデータ a>b および b>10 をテストすると、a>b および a>10 および b>10 になります。 最適化は重要です
10. その他のクエリの最適化
ホームページ データベース mysql チュートリアル MySQL クエリ最適化の詳細な紹介

MySQL クエリ最適化の詳細な紹介

Mar 26, 2017 am 11:46 AM

1. はじめに

優れた Web アプリケーションで最も重要なことは、優れたアクセス パフォーマンスです。データベース MySQL は Web アプリケーションに不可欠な部分であり、そのパフォーマンスを決定する重要な部分です。したがって、MySQL のパフォーマンスを向上させることが重要です。

MySQL のパフォーマンスの向上は、ハードウェア、ネットワーク、ソフトウェアの 3 つの部分に分けることができます。このうち、ハードウェアとネットワークは会社の財源に依存し、多額の費用がかかるため、ここでは触れません。ソフトウェアは多くの種類に分類されます。ここでは、MySQL クエリの最適化によってパフォーマンスの向上を実現します。

最近、クエリ最適化に関する本を何冊か読み、オンラインで先輩が書いた記事も読みました。

以下は、私がコンパイルして学んだクエリ最適化に関する概要です:

2. SQL ステートメントのインターセプト

1. 包括的なクエリ ログ

2. 遅いクエリ ログ

3. バイナリ ログ

4. プロセスlist

Show FULL PROCESSLIST;

。 。 。

3. クエリ最適化のための基本的な分析コマンド

1. EXPLAIN {PARTITIONS|EXTENDED}

2. SHOW CREATE TABLE タブ;

3. SHOW INDEXS FROM tab;

4. SHOW TABLE STATUS LIKE 'tab';

5. SHOW [GLOBAL|SESSION] STATUS LIKE '';

6. SHOW VARIABLES

。 。 。 。

追伸:個人的には、上記のものはどれも栄養的には欠けていると感じています。こちらが実物です。

4. クエリ最適化のためのいくつかの方向性

1. フルテキストスキャンを回避し、対応するフィールドにインデックスを追加し、クエリにインデックスを使用するようにしてください

2. 未使用または重複したインデックスを削除します

3. クエリの書き換え、等価変換(述語、サブクエリ、結合クエリ)

4. 繰り返しコンテンツのある不要なステートメントを削除し、ステートメントを合理化します

5. 繰り返し実行されるステートメントを統合します

6. クエリ結果をキャッシュします

5. インデックスの最適化

5.1. インデックスの利点:

1. データの整合性を維持します

2. データのクエリパフォーマンスを改善します

3. テーブルの結合操作(jion)を改善します

4. クエリ結果を並べ替えます。インデックスがない場合、内部ファイルソートアルゴリズムがソートに使用され、低速になります

5. 集計データの操作を簡素化します

5.2. インデックスのデメリット

1. インデックスは一定量のストレージスペースを占有する必要があります

2. データの挿入、更新、削除はインデックスの影響を受け、パフォーマンスが低下します。データが変化するため、インデックスも更新する必要があります

3. 複数のインデックス、オプティマイザーに時間がかかる場合は、最適なものを選択します

5.3. インデックスの選択

1. データ量が多い場合に使用します

2. データの反復性が高い場合は使用しないでください

3. クエリがデータの 20% を超えて取得する場合は、インデックスを作成せずに全文スキャンが使用されます

5.4. インデックスの詳細な検討

データ クエリ:

MySQL の InnoDB と MyISAM は B-Tree タイプのインデックスです

B-Tree には PRIMARY KEY、UNIQUE、INDEX、FULLTEXT が含まれます

B-Tree タイプのインデックスはサポートされていません (つまり、フィールドで次の記号が使用されている場合) 、インデックスは使用されません):

>, <, >=, <=, BETWEEN , !=, <>,like '%**'

【カバーインデックスを紹介しますまずは】

分かりやすくご紹介させて頂きます。カバーインデックスは、主キーインデックスや一意インデックスのように実際には存在しません。これは、インデックス適用のための特定のシナリオを定義するだけです (別の理解: クエリされた列はインデックス列であるため、その列はインデックスによってカバーされます)。従来の制限を突破し、上記の演算子を使用し、クエリにインデックスを使用することができます。

クエリ対象の列はインデックス列であるため、行を読み取る必要はなく、列フィールドのデータのみを読み取る必要があります。 [たとえば、本を読んでいて、特定の内容を見つける必要があり、その内容がたまたま目次に表示されている場合、ページごとにめくる必要はなく、目次でそのページを見つけるだけです。コンテンツと検索]

カバーインデックスを有効にするにはどうすればよいですか?具体的なシナリオとは何ですか?

インデックスフィールドは選択に表示されるだけです。

複合インデックスには他の特別なシナリオも存在する可能性があります。たとえば、3 列の複合インデックスの場合、カバー インデックスの使用を有効にするには、select、where、group by、order by で複合インデックスの左端の列を 1 回出現させるだけで済みます。

View:

EXPLAIN の余分に「インデックスを使用」と表示され、このステートメントがカバーインデックスを使用していることを示します。

結論:

クエリ時に select*from を使用することは推奨されません。クエリのパフォーマンスを向上させるために、必要なフィールドを記述し、対応するインデックスを追加する必要があります。

上記演算子の実際の測定結果:

1. select*from の形式では、where の主キーを使用して kill [like を除く] (クエリインデックスに主キーを使用することはできません)。全て。

2. select field a from tab where field a "上記の演算子" の形式でテストしますが、結果はインデックスを使用してクエリすることができます。 【カバーリングインデックスの使用】

他のインデックス最適化方法:

1. 接続条件としてインデックスキーワードを使用します

2. 複合インデックスを使用します

3. インデックスのマージ、または関連するフィールドを複合インデックスにマージします

4. where と group by が含まれますフィールドとインデックス

6. サブクエリの最適化

fromには、親レイヤーにプルアップできる非相関サブクエリがあります。複数テーブルの結合クエリでは、選択する前に結合コストを考慮してください。

クエリオプティマイザーは通常、サブクエリに対してネストされた実行を使用します。つまり、親クエリの各行に対してサブクエリを1回実行するため、サブクエリは何度も実行されます。この実行方法は非常に非効率的です。

サブクエリを結合クエリに変換する利点:

1. サブクエリを何度も実行する必要がない

2. オプティマイザは情報に基づいてさまざまな方法と接続シーケンスを選択できます

3. 接続条件とフィルタリングサブクエリの条件が親クエリのフィルタ条件に変更され、効率が向上します。

最適化:

サブクエリのマージ。複数のサブクエリがある場合は、可能な限りそれらをマージするようにしてください。

サブクエリの展開、つまりプルアップは複数テーブルのクエリになります(常に等価な変更が保証されます)

注:

サブクエリに集計関数、GROUP BY、が含まれる場合、サブクエリの展開は単純なクエリのみを展開できます。および DISTINCT の場合、プルアップできません。

select*from t1 (select*from tab where id>10) as t2 where t1.age>10 and t2.age

select*from t1,tab as t2 where t1.age>10 and t2. age<25 および t2.id>10;

具体的な手順:

1. from と from をマージし、対応するパラメーターを変更します

2. where と where をマージし、connect with and

3. 対応する述語を変更します (in =)

7. 同等の述語の書き換え:

1. BETWEEEN AND を >=、<= などに書き換えます。実測:データ10万件、書き換え前後の時間、1.45秒、0.06秒

2.倍数またはinで変換します。フィールドがインデックスの場合、両方ともインデックスを使用できるか、より効率的です

3. 'abc%' のような名前は、name>='abc' および name<'abd';

注: millions として書き換えられます。名前にインデックスがないレベルのデータ テストは、後者のクエリよりも高速です。フィールドにインデックスを追加した後は、後者のクエリの方が少し高速ですが、両方のメソッドがクエリ時にインデックスを使用するため、大きな違いはありません。

。 。 。 。

8. 条件の単純化と最適化

1. where、having(groupbyやaggregate関数がない場合)、join-on条件を可能な限り組み合わせる

2. 不要な括弧を削除し、構文の断片化を減らす or andとツリーレイヤーによりCPU消費量が削減されます

3. 一定の転送。 a=b および b=2 は、a=2 および b=2 に変換されます。変数 a=b または a=@var

を使用しないようにします

4. 無駄な SQL 条件を削除します

5. where 等号の右側で式の計算を実行したり、関数を使用したりしないようにしてください。 where のフィールド

6. 恒等変換と不等式変換。例: 数百万のデータ a>b および b>10 をテストすると、a>b および a>10 および b>10 になります。 最適化は重要です

9. 外部接続の最適化

これは、外部接続を内部接続に変換することです。

利点:

1. 最適化プロセッサーは外部結合をより多くのステップで処理し、内部結合よりも時間がかかります

2. 外部結合が排除された後、オプティマイザーは複数テーブルの順序を選択する際により多くの選択肢を持ちます結合を結合し、最適なものを選択できます

3. 条件を最も絞り込むことができます 外面(接続順序の最初、多層ループ本体の外ループ層)として厳密なテーブルを使用すると、不要な I/O オーバーヘッドを削減し、アルゴリズムの実行を高速化します。

on a.id=b.id と where a.id=b.id の違いは、on はテーブルが接続されることを意味し、where はデータを比較します

注: 結果が NULL であることが前提である必要があります(つまり、条件が NULL ではない) 意味的に言えば、データ行、内部結合)

最適化原則:

クエリの合理化、接続の削除、等価変換、冗長なテーブル オブジェクト接続の削除

例: 主キー/一意キー接続条件として、中間テーブルの列は etc としてのみ使用されます。値の条件では、中間テーブルの接続を削除できます

10. その他のクエリの最適化

1. 以下により、インデックス クエリが破棄され、完全になります。使用するテキスト スキャン

1.1. where 句で != または <> 演算子を使用します。非主キーはサポートされていません

1.2. orの使用を避ける

テスト後、orを使用してもインデックスが使用できないというわけではありませんが、場合によっては使用されない場合もあります。が使用されるため、特定の状況を分析します。

同様の最適化:

select * from tab name='aa' or name='bb';

=>

select * from tab name='aa'

union all

Select * from tab name ='bb';

実測値:

1. インデックスなしで 100,000 個のデータでテストしたところ、上記のクエリ速度は以下のクエリの 2 倍速かった。

2. 30万データのテスト、aaとbbが別々にインデックス付けされている場合、次のクエリ速度はorよりも少し速くなります。

1.3. not in の使用を避ける

not in は一般にインデックスを使用できません

1.4. where では null 判定を使用しないようにしてください

1.5. Like の前に「%.com」を付けることはできません

解決策:

1. % プレフィックスを使用する必要があり、URL などデータ長が大きくない場合は、データを反転してデータベースに保存し、再度確認することができます。 LIKE REVERSE'%.com';

2. カバーリングインデックスを使用する

1.6. インデックスフィールドを条件として使用する場合、複合インデックスの場合、インデックスの一番左のプレフィックスを持つフィールド名を使用する必要があります

2.存在を in に置き換えます

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)

100万個のデータなら6.65かかります59,417 個のデータをフィルタリングするには 4.18 秒。他の最適化は行われず、exists を in に置き換えるだけです。

3. フィールド定義は文字列であり、クエリ時に引用符は使用されず、フルテキスト スキャンは実行されません。

【以下は深夜のLuantanqinブログ投稿http://www.cnblogs.com/lingiu/p/3414134.htmlからの抜粋です】対応するテストは行っていません】

4.テーブル変数を使ってみる。一時テーブルの代わりに

5. システム テーブル リソースの消費を削減するために、一時テーブルの頻繁な作成と削除を避けてください

6. 一時テーブルを使用する場合は、最初にストアド プロシージャの最後にすべての一時テーブルを明示的に削除する必要がありますtruncate table, thendrop table, これにより、システム テーブルの長期ロックを回避できます

7. カーソルによって操作されるデータが 10,000 行を超える場合は、カーソルの使用を避けるようにしてください

8. データ量が大きい場合 データ量が大きすぎる場合は、対応する要件が妥当であるかどうかを検討する必要があります。

9. 大規模なトランザクション操作を避け、システムの同時実行性を向上させるようにしてください。

以上がMySQL クエリ最適化の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

MySQL:世界で最も人気のあるデータベースの紹介 MySQL:世界で最も人気のあるデータベースの紹介 Apr 12, 2025 am 12:18 AM

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

MySQLの場所:データベースとプログラミング MySQLの場所:データベースとプログラミング Apr 13, 2025 am 12:18 AM

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

なぜMySQLを使用するのですか?利点と利点 なぜMySQLを使用するのですか?利点と利点 Apr 12, 2025 am 12:17 AM

MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

Apacheのデータベースに接続する方法 Apacheのデータベースに接続する方法 Apr 13, 2025 pm 01:03 PM

Apacheはデータベースに接続するには、次の手順が必要です。データベースドライバーをインストールします。 web.xmlファイルを構成して、接続プールを作成します。 JDBCデータソースを作成し、接続設定を指定します。 JDBC APIを使用して、接続の取得、ステートメントの作成、バインディングパラメーター、クエリまたは更新の実行、結果の処理など、Javaコードのデータベースにアクセスします。

DockerによるMySQLを開始する方法 DockerによるMySQLを開始する方法 Apr 15, 2025 pm 12:09 PM

DockerでMySQLを起動するプロセスは、次の手順で構成されています。MySQLイメージをプルしてコンテナを作成および起動し、ルートユーザーパスワードを設定し、ポート検証接続をマップしてデータベースを作成し、ユーザーはすべての権限をデータベースに付与します。

Centosはmysqlをインストールします Centosはmysqlをインストールします Apr 14, 2025 pm 08:09 PM

CentOSにMySQLをインストールするには、次の手順が含まれます。適切なMySQL Yumソースの追加。 yumを実行して、mysql-serverコマンドをインストールして、mysqlサーバーをインストールします。ルートユーザーパスワードの設定など、MySQL_SECURE_INSTALLATIONコマンドを使用して、セキュリティ設定を作成します。必要に応じてMySQL構成ファイルをカスタマイズします。 MySQLパラメーターを調整し、パフォーマンスのためにデータベースを最適化します。

MySQLの役割:Webアプリケーションのデータベース MySQLの役割:Webアプリケーションのデータベース Apr 17, 2025 am 12:23 AM

WebアプリケーションにおけるMySQLの主な役割は、データを保存および管理することです。 1.MYSQLは、ユーザー情報、製品カタログ、トランザクションレコード、その他のデータを効率的に処理します。 2。SQLクエリを介して、開発者はデータベースから情報を抽出して動的なコンテンツを生成できます。 3.MYSQLは、クライアントサーバーモデルに基づいて機能し、許容可能なクエリ速度を確保します。

MySQLをCentos7にインストールする方法 MySQLをCentos7にインストールする方法 Apr 14, 2025 pm 08:30 PM

MySQLをエレガントにインストールするための鍵は、公式のMySQLリポジトリを追加することです。特定の手順は次のとおりです。MYSQLの公式GPGキーをダウンロードして、フィッシング攻撃を防ぎます。 mysqlリポジトリファイルを追加:rpm -uvh https://dev.mysql.com/get/mysql80-community-rease-el7-3.noarch.rpm update yumリポジトリキャッシュ:yumアップデートインストールmysql:yumインストールmysql-server startup mysql sportin

See all articles