MySQLの最適化の詳細な分析とパフォーマンス

MySQLの最適化の詳細な分析とパフォーマンス

導入

データベースを使用したことがある人なら、機能面での like 記号と = 記号の類似点と相違点をご存知でしょう。ここで簡単にまとめてみましょう。

1. 相違点: Like はあいまい検索に使用できますが、'=' はこの機能をサポートしていません。次の例のように、フィールド ID の最初の文字が 1 である情報テーブルのデータをクエリします。

ID が '1%' のような情報から * を選択します。

2. 類似性: 正確な検索には、「like」と「=」の両方を使用できます。

たとえば、次の例はすべて、フィールド ID が '12345' に等しい info テーブルの結果をクエリします。

IDが '12345' のような情報から * を選択します。

上記は、返される結果における like と '=' の類似点と相違点です。すると、好奇心旺盛な友人たちは、処刑のプロセスはどうなっているのかと尋ねるかもしれません。 MySQL の実行プロセスは、like または '=' に遭遇しても同じですか?

そうです、物事は見た目だけで判断してはいけません。よく調べてみると、「いいね」と「=」はそれほど単純ではないことがわかります。以下では、この2つの違いを詳しく分析します~~~

文章

まず、MySQL の explain キーワードを紹介します。explain は実行プランを意味します。つまり、このコマンドを使用してこの SQL がどのように実行されるかを確認します。
使用方法も非常に簡単で、explain + sql ステートメントを使用します。例:

説明 select * from info where id like '12345';

次に、explain を使用して like および = の下にあるクエリをテストします。まず、インデックス付きフィールドをテストします。

説明選択
 * 
から
 crms_顧客 
どこ
 id = '7cf79d7c8a3a4f94b5373b3ec392e32d';

ここで、「=」を「like」に置き換えて試してみましょう。

説明選択
 * 
から
 crms_顧客 
どこ
 id は '7cf79d7c8a3a4f94b5373b3ec392e32d' のようになります。

比較すると、返された 2 つの結果の type フィールドと Extra フィールドのデータが異なっていることがわかります。なぜ異なるのでしょうか。また、どのような意味があるのでしょうか。

タイプフィールド

タイプ フィールドはオプションの値であり、値は次のように最低パフォーマンスから最高パフォーマンスの順に並べ替えられます。

タイプ例示する
システムシステム、テーブルには 1 行のみが含まれます (= システム テーブル)。これは const join 型の特殊なケースです。
定数定数。テーブルには一致する行が最大で 1 つあります。行が 1 つしかないため、この行の列値は、オプティマイザの残りの部分によって定数とみなされます。定数テーブルは 1 回だけ読み取られるため、高速です。
EQ_REF検索時に主キーまたは一意の型を使用する
参照インデックスで1つ以上の値を検索する
インデックスマージ複数の単一列インデックスを使用して検索するためにインデックスをマージする
範囲インデックス列の範囲を検索する
索引完全なインデックステーブルスキャン
全て完全なテーブルスキャン

表からわかるように、const は定数検索、RANGE はインデックス列の範囲検索なので、パフォーマンスが明確に反映されています。

では、like クエリを使用する場合、Extra フィールドは何を表すのでしょうか?追加フィールドの「どこを使用する」とはどういう意味ですか?

追加フィールド

1. Extra フィールドも Explain 出力の非常に重要な列であり、MySQL クエリ オプティマイザのクエリ実行プロセス中のクエリ プランの重要な補足情報を表します。

2. Extra フィールドで where を使用すると、ストレージ エンジンが行を取得した後に MySQL サーバーがフィルタリングすることになります。したがって、「=」を使用する場合と比較して、検索プロセスに 1 つのステップが追加されます。

明らかに、上記の要約から、条件付きクエリにインデックス フィールドを使用する場合、 '=' のパフォーマンスは like よりも高速であると結論付けることができます。

これで終わりだと思いますか?

しかし、

インデックス以外のフィールドについてはどうなのかと尋ねる友人もいるかもしれません。

はい、インデックスされていないフィールドのテストを続けましょう。

説明選択
 * 
から
 crms_顧客 
どこ
 customer_name = '張飛';
-----------------------------------
 
説明選択
 * 
から
 crms_顧客 
どこ
 customer_name LIKE '張飞';

「=」を除いて同じ 2 つのステートメントを実行してみましょう。
"=":

のように:

非インデックスフィールドの場合は、like と "=" は同じであり、パフォーマンスに違いがないことがわかります。

(もちろん、explain には他にもたくさんのフィールドがあり、後ほど一つずつ説明していきます。)

結論は

絶え間ない努力の結果、like と "=" を非インデックス フィールドを使用してクエリした場合、パフォーマンスは同じであるという結論を導き出すことができます。インデックス フィールドを使用する場合、"=" はインデックスに直接ヒットし、一度だけ読み取られますが、like は範囲クエリを必要とするため、"=" の方が like よりもパフォーマンスが優れています。 ~~~~

これで、MySQL の like and = パフォーマンスの最適化に関するこの記事は終了です。MySQL の like and = パフォーマンスに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL での %% のようなファジークエリの実装
  • MySQL での LIKE 句の使用に関するチュートリアル
  • MySQL でのテーブルレプリケーション: create table like および create table as select
  • MySQL のあいまいクエリと正規表現の概要
  • MySQL の Like の概念と使用法の説明

<<:  Linux ipcsコマンドの使用

>>:  VueプロジェクトでReactを書く方法の詳細

推薦する

複数の無関係なテーブルからデータをクエリし、MySQL でページングする方法

MySQL 複数の無関係なテーブルクエリデータとページング機能要件主キーと外部キーの関連付けがない ...

IE6 で JS エラーが発生し、CSS が適用されない HTML エンコードの問題の解決策

テストでは、ページ定義がutf-8でエンコードされている場合、 js ファイルに中国語などのマルチバ...

WeChat アプレット uniapp は左スワイプによる削除効果を実現します (完全なコード)

WeChatアプレットuniappは左スワイプで削除効果を実現成果を達成する1. スワイプしてリス...

ネットワークセグメント内の IP アドレスに対する Nginx の接続制限設定の詳細な説明

Nginx におけるいわゆる接続制限は、実際には TCP 接続、つまり 3 ウェイ ハンドシェイク後...

HTML チュートリアル: よく使われる HTML タグのコレクション (6)

関連記事:初心者が学ぶ HTML タグ (5)導入された HTML タグは、必ずしも XHTML 仕...

HTML 画像 img タグ_Powernode Java アカデミー

まとめプロジェクトの説明形式<img src="..."> H2+ ...

vue router-view のネストされた表示実装

目次1. ルーティング構成2. Vueページのネスト3. ネストされた関係1. ルーティング構成 定...

HTML テーブル マークアップ チュートリアル (10): セル パディング属性 CELLPADDING

セルのパディングは、セルの内容と境界線の間の距離です。基本的な構文<TABLE セルパディング...

よく使われる Docker コマンドと例の概要と分析

目次1. コンテナライフサイクル管理(1)ドッカー実行(2)スタート/ストップ/リスタート(3)ドッ...

grep を使用して MySQL エラー ログ情報を取得する方法の詳細な説明

MySQL のメンテナンスを容易にするために、エラー情報を収集するためのインターフェースを提供するス...

Vue+Router+Element でシンプルなナビゲーションバーを実装する

このプロジェクトでは、Vue+Router+Element の具体的なコードを共有して、シンプルなナ...

Vue+js はビデオのフェードインとフェードアウト効果を実現します

Vue+jsはビデオのフェードインとフェードアウトを実現します。参考までに、具体的な内容は次のとおり...

MySQLデータベースを誤って削除した後にデータを回復するための手順

日々の運用・保守作業において、MySQL データベースのバックアップは重要です。ウェブサイトにとって...

CentOS 6 は Docker を使用して Zookeeper 操作例を展開します

この記事では、Docker を使用して Centos6 に Zookeeper をデプロイする方法に...

CSS3 で画像ドロワー効果を実装するためのサンプル コード

いつものように、まずは画像効果を投稿しましょう: このエフェクトの原理は非常にシンプルです。CSS3...