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 ページング分析の原理と効率改善PERCONA PERFORMANCE CONFERENC...

CSS flex 複数列レイアウト

基本的な3列レイアウト 。容器{ ディスプレイ: フレックス; 幅: 500ピクセル; 高さ: 20...

jsで七夕告白連打の効果を実現、jQueryで連打技術を実現

この記事では、jsとjQueryテクノロジーを使用して告白弾幕を実現する方法を紹介します。具体的な内...

ウェブページの右下隅に「いいね!」カード効果を実現するための CSS (サンプルコード)

効果 HTML を実装するには、まずクリーンな HTML ページを準備し、ノードを記述します。 &l...

シンプルなウェブ計算機を実装するJavaScript

背景私は新しいプロジェクト チームに配属されたので、プロジェクトでは js を使用する必要があります...

Linux環境でよく使われるMySQLコマンドの紹介

mysql コマンドを入力します: mysql -u+(ユーザー名) -p+(パスワード) mysq...

Vueコンポーネントの基本のまとめ

コンポーネントの基本1 コンポーネントの再利用コンポーネントは再利用可能な Vue インスタンスです...

ウェブページでメモの詳細が灰色になる問題に対処する

1. IE では、相対的な配置、つまり <div style="background...

Vue2 と Vue3 でウォッチ リスナーを使用する方法

watch : データの変更を監視する(特定の値の変更イベント) vue2.x データ(){ 戻る ...

1 つの記事で v-model とその修飾子を学ぶ

目次序文v-model の修飾子:怠け者トリム番号さまざまな入力タイプやその他の要素での v-mod...

CSS の新機能には、コントロールページの再描画と再配置の問題が含まれています

新しい CSS プロパティ contain を紹介する前に、読者はページの再描画と再配置が何であるか...

Web デザイン リファレンス Firefox デフォルト スタイル

W3C は HTML の標準をいくつか確立していますが、ブラウザは独自の定義済みスタイルに従って W...

Vue の nextTick について話す

データが変更されても、DOM ビューはすぐには更新されません。変更直後にノードまたはその値を取得しよ...

6秒でMySQLに100万件のレコードを挿入する方法を教えます

1. アイデアMySQL に 1,000,000 件のレコードを挿入するのにたった 6 秒しかかかり...

長いデータを HTML で表示するときに処理する方法

HTML で長いデータを表示する場合、マウスをその上に移動するとデータを切り捨てて完全なデータを表示...