MySQL の低速クエリの最適化: 理論と実践からの制限の利点

MySQL の低速クエリの最適化: 理論と実践からの制限の利点

多くの場合、クエリの結果は最大で 1 つのデータ レコードになることが予想されます。この場合、制限 1 を使用するのが最適です。このデータが見つかると、MySQL はすぐにクエリを終了し、それ以上の無駄なクエリを実行しないため、効率が向上します。

実際に、100,000 エントリの MySQL テーブルで Lily のスコアを検索してテストしてみましょう (システムには Lily が 1 人しかおらず、このデータのみが必要であると仮定します)。時間の違いを示すために、テーブルの名前フィールドにインデックスを作成しません。

まずテーブル構造を見てみましょう。

mysql> show テーブル tb_province を作成します。
+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| テーブル | テーブルの作成 |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_province | テーブル `tb_province` を作成します (
 `id` bigint(10) 符号なし NOT NULL AUTO_INCREMENT,
 `name` varchar(32) NOT NULL,
 `score` int(10) unsigned DEFAULT '0',
 `x` int(10) 符号なし デフォルト '0',
 `x1` int(10) 符号なし デフォルト '0',
 `x2` int(10) 符号なし デフォルト '0',
 `x3` int(10) 符号なし デフォルト '0',
 `x4` int(10) 符号なし デフォルト '0',
 `x5` int(10) 符号なし デフォルト '0',
 `x6` int(10) 符号なし デフォルト '0',
 `x7` int(10) 符号なし デフォルト '0',
 `x8` int(10) 符号なし デフォルト '0',
 `x9` int(10) 符号なし デフォルト '0',
 `x10` int(10) 符号なし デフォルト '0',
 主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=124178 デフォルト文字セット=latin1 |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
セット内の 1 行 (0.00 秒)

スイッチ set profiling=1; をオンにして、比較のために mysql ステートメントを実行します。

mysql> name='lily' の tb_province からスコアを選択します。
+-------+
| スコア |
+-------+
| 100 |
+-------+
セット内の1行(0.03秒)

mysql> name='lily' の tb_province からスコアを選択します。
+-------+
| スコア |
+-------+
| 100 |
+-------+
セット内の1行(0.03秒)

mysql> name='lily' の tb_province からスコアを選択します。
+-------+
| スコア |
+-------+
| 100 |
+-------+
セット内の1行(0.04秒)

mysql> name='lily' の tb_province からスコアを選択します。
+-------+
| スコア |
+-------+
| 100 |
+-------+
セット内の1行(0.02秒)

mysql> name='lily' の tb_province からスコアを選択します。
+-------+
| スコア |
+-------+
| 100 |
+-------+
セット内の1行(0.03秒)

mysql> tb_province からスコアを選択します。name='lily' 制限 1;
+-------+
| スコア |
+-------+
| 100 |
+-------+
セット内の 1 行 (0.00 秒)

mysql> tb_province からスコアを選択します。name='lily' 制限 1;
+-------+
| スコア |
+-------+
| 100 |
+-------+
セット内の 1 行 (0.00 秒)

mysql> tb_province からスコアを選択します。name='lily' 制限 1;
+-------+
| スコア |
+-------+
| 100 |
+-------+
セット内の 1 行 (0.00 秒)

mysql> tb_province からスコアを選択します。name='lily' 制限 1;
+-------+
| スコア |
+-------+
| 100 |
+-------+
セット内の1行(0.01秒)

mysql> tb_province からスコアを選択します。name='lily' 制限 1;
+-------+
| スコア |
+-------+
| 100 |
+-------+
セット内の 1 行 (0.00 秒)

ご覧のとおり、制限 1 を使用するかどうかについて 5 つの比較テストを実施しました。結果を見てみましょう。

mysql> プロファイルを表示します。
+----------+-------------+----------------------------------------------------------------------+
| Query_ID | 期間 | クエリ |
+----------+-------------+----------------------------------------------------------------------+
| 5 | 0.02686000 | name='lily' の tb_province からスコアを選択 |
| 6 | 0.02649050 | name='lily' の tb_province からスコアを選択 |
| 7 | 0.03413500 | name='lily' の tb_province からスコアを選択 |
| 8 | 0.02601350 | name='lily' の tb_province からスコアを選択 |
| 9 | 0.02785775 | name='lily' の tb_province からスコアを選択 |
| 10 | 0.00042300 | name='lily' の tb_province からスコアを選択、制限 1 |
| 11 | 0.00043250 | name='lily' の tb_province からスコアを選択、制限 1 |
| 12 | 0.00044350 | name='lily' の tb_province からスコアを選択、制限 1 |
| 13 | 0.00053200 | name='lily' の tb_province からスコアを選択、制限 1 |
| 14 | 0.00043250 | name='lily' の tb_province からスコアを選択、制限 1 |
+----------+-------------+----------------------------------------------------------------------+
セット内の行数は 14 行、警告数は 1 (0.00 秒)

制限 1 を使用した後、MySQL ステートメントの効率が実際に大幅に向上していることがわかります。 テーブルが大きくなればなるほど、効率性の向上がより顕著になります。

理論的なスクリプトと実際のスクリプトの両方で制限の利点を実証したので、提案としては、制限が利用可能な場合は制限を使用する (もちろん、結果が複数の場合は、制限 1 を使用することはできません) ということです。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQL の遅いクエリの最適化方法と最適化の原則
  • MySQL スロークエリを通じて MySQL のパフォーマンスを最適化する方法
  • MySQL のスロークエリの最適化とスロークエリのログ分析の例のチュートリアル
  • MySQL の遅いクエリの最適化ソリューション

<<:  Nginx プロキシ転送構成を通じてクロスドメイン API プロキシ転送を実装する方法

>>:  JavaScript の 50 以上のユーティリティ関数の概要

推薦する

CSS で 3 列レイアウトを実装するいくつかの方法と利点と欠点

序文3 列レイアウトは、その名前が示すように、両側が固定され、中央が適応します。実際の開発では、3 ...

VMware 15.5 バージョンのインストール Windows_Server_2008_R2 システム チュートリアル図

1. VMware 15.5から新しい仮想マシンを作成する1. VMware を開き、ホームページで...

Alibaba Cloud Server Tomcatにアクセスできません

目次1. はじめに2. 解決策2.1 ファイアウォールを設定してポートを開く2.3 ポートを確認し、...

CSS 擬似要素::マーカーの詳細な説明

この記事では、CSS ::markerの興味深い疑似要素を紹介します。これを使用すると、テキスト番号...

CentOS 6.6 ソースコードのコンパイルと MySQL 5.7.18 のインストールチュートリアルの詳細な説明

1. ユーザーとグループを追加する1. mysqlユーザーグループを追加する # グループ追加mys...

MySQLは、統計クエリを最適化するために、sum、case、whenを巧みに使用します。

私は最近、会社で統計レポートの開発に関わるプロジェクトに取り組んでいました。データの量が比較的多かっ...

Vue2.x および Vue3.x のカスタム命令の使用方法とフック関数の原理を理解する

目次Vue2.x の使用法グローバル登録部分登録使用フック機能フック関数のパラメータVue3.x の...

Ubuntu 20.04 と NVIDIA ドライバーのインストールに関するチュートリアル

Ubuntu 20.04をインストールする NVIDIAドライバーをインストールする Pytouch...

開発者がデータベースロックを詳細に理解する必要がある理由

1.ロックしますか? 1.1 ロックとは何ですか?ロックの本当の意味は、鍵またはコードで開くことがで...

Dockerに関するよくある質問

Docker はポートを IPv6 にのみマッピングし、IPv4 にはマッピングしません。 dock...

Vueにおける混合継承の詳細な説明

目次混合継承の影響: 1. 継承Vue.extend メソッド​プロパティを拡張する2. ミックスイ...

css3 flexレイアウト justify-content:space-between 最後の行は左揃えになります

justify-content:space-betweenレイアウトを使用する場合、要素の最後の行に...

Reactでパスワード強度検出器を実装する方法

目次序文使用コンポーネントの記述データ構造分析プロセス分析基礎コードの分析他の要約する序文パスワード...

Linux で実行可能ファイルを実行するときに「そのようなファイルまたはディレクトリはありません」というプロンプトが表示される場合の解決策

最近、Linux オペレーティング システムを使用して実行可能ファイルを実行していたところ、「そのよ...

Centos7.3 での mysql5.7 のインストールと設定のチュートリアル

この記事では、MySQL 5.7のインストールと設定のチュートリアルを参考までに紹介します。具体的な...