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を書く方法の詳細

推薦する

CSS3で実装された天気アイコンのアニメーション効果

成果を達成する 実装コードhtml <div class="wrapper"...

CentOS 7.6 Telnetサービス構築プロセス(Opensshアップグレードバトル第一弾のバックアップトランスポートライン構築)

不明な点があるときはいつでも、Blog Park にアクセスして、いつでも答えやインスピレーションを...

効果的なウェブフォームのための 8 つのルール

ユーザーから情報を収集する場合、Web フォームを使用するより簡単で直接的な方法はありません。適切に...

docker-compose が遅すぎる場合の解決策の詳細な説明

解決策はただ一つ、ソースを変更することです。 github からのソースは基本的にタイムアウトするの...

1つのSQL文でMySQLの重複排除が完了し、1つが保持されます。

数日前、ある要件に取り組んでいたとき、MySQL で重複レコードをクリーンアップする必要がありました...

MySQL の時間タイプの選択

目次日時タイムスタンプ選び方ミリ秒の時間を保存する方法結論MySQL は、日付と時刻を処理するために...

Docker に ElasticSearch をインストールする方法を 1 つの記事で解説

目次序文1. Dockerをインストールする2. ElasticSearchをインストールする3. ...

JavaScript の継承についてどれくらい知っていますか?

目次序文コンストラクタ、プロトタイプオブジェクト、インスタンスオブジェクトの関係プロトタイプチェーン...

垂直グリッドと漸進的な行間隔の例

新しい質問急いで来て、急いで行ってください。 「垂直グリッドとプログレッシブ行間隔 (パート 1)」...

入力ボックスのオートコンプリート機能をオフにする

これで、autocomplete と呼ばれる input の属性を使用できるようになりました。オート...

Ubuntu 18.04 に mysql5.7.23 をインストールするチュートリアル

この記事では、Ubuntu18.04にmysql5.7.23をインストールする具体的な方法を参考まで...

Linux マルチスレッドにおけるフォークとミューテックス ロック プロセスの例

目次質問: 1. 最初の試み2. 合理的な分析3. 問題解決(1) pthread_join()の使...

vue+springbootでログイン機能を実現

この記事の例では、ログイン機能を実現するためのvue+springbootの具体的なコードを参考まで...

スケジュールされた時間に古いジャンクファイルを自動的に削除する Linux 用の Autotrash ツール

Autotrash は、古い削除済みファイルを消去するプロセスを自動化するコマンド ライン プログラ...

Docker環境にJenkinsコンテナをインストールする詳細なチュートリアル

推奨される Docker 学習教材: https://www.runoob.com/docker/d...