MySQL における or、in、union、インデックス最適化の詳細な分析

MySQL における or、in、union、インデックス最適化の詳細な分析

この記事は、「1 分でインデックス作成スキルを学ぶ」という宿題から生まれました。

注文ビジネス テーブルの構造が次のとおりであると仮定します。

順序(oid、日付、uid、ステータス、金額、時間、…)

で:

  • oid、注文ID、主キー
  • 日付、注文日には共通のインデックスがあり、管理バックエンドは日付でクエリを実行することが多い
  • uid、ユーザーID、共通のインデックスを持ち、ユーザーは自分の注文を照会します
  • ステータス、注文ステータスには共通のインデックスがあり、管理バックエンドはステータスに応じてクエリを実行することが多い
  • 金額/時間、注文金額/時間、照会フィールド、インデックスなし

注文には 0 が発注済み、1 が支払い済み、2 が完了の 3 つの状態があるとします。

ビジネス要件: 未完了の注文をクエリする場合、どの SQL の方が高速ですか?

  • ステータスが 2 である順序から * を選択
  • ステータス=0 またはステータス=1 の順序から * を選択します
  • ステータスが (0,1) である順序から * を選択
  • ステータス=0 の順序から * を選択
    すべて結合
    ステータスが 1 である順序から * を選択

結論: ソリューション 1 は最も遅く、ソリューション 2、3、4 はすべてインデックスにヒットできます。

しかし...

1: union allは確実にインデックスにヒットする

ステータス=0 の順序から * を選択

すべて結合

ステータスが 1 である順序から * を選択

例:

MySQLに何をするかを直接指示すると、MySQLはCPUを最も少なく消費します

プログラマーはこのようなSQLを書くことはあまりありません(union all)

2: シンプルインでインデックスにヒットできる

ステータスが (0,1) である順序から * を選択

例:

MySQLに考えさせると、クエリの最適化はunion allよりも多くのCPUを消費しますが、無視できるほどです。

プログラマーはSQLを次のように書くことが多い。この例では、次のように書くのが推奨される。

3: または、MySQLの新しいバージョンはインデックスにヒットすることができます

ステータス=0 またはステータス=1 の順序から * を選択します

例:

MySQL に考えさせてください。クエリの最適化は IN よりも多くの CPU を消費します。MySQL に負担をかけないでください。

すべての or がインデックスにヒットするわけではないので、プログラマが or を頻繁に使用することは推奨されません。

MySQLの古いバージョンの場合は、クエリと分析を行うことをお勧めします。

4. !=の場合、否定クエリは確実にインデックスにヒットしません

ステータスが 2 である順序から * を選択

例:

フルテーブルスキャンは、すべてのソリューションの中で最も効率が悪く、最も遅い

否定的な検索は禁止されています

V. その他のオプション

ステータスが 2 未満の順序か​​ら * を選択

この特定の例では、確かに高速ですが、

この例では、3 つの状態のみが示されています。実際の業務では、これら 3 つの状態よりも多くの状態があり、状態の「値」は半順序関係を満たすだけです。他の状態をチェックしたい場合はどうすればよいでしょうか。SQL は列挙の値に依存すべきではなく、解決策は普遍的ではありません。

この SQL は読みにくく、理解しにくく、保守性も低いため、強く推奨されません。

6. 宿題

このようなクエリはインデックスにヒットできますか?

uid in (の順序で*を選択

   ステータス=0の注文からUIDを選択

)

select * from order where status in (0, 1) order by date desc

ステータスが 0 または日付が CURDATE() である順序から * を選択します

注: これは単なる例です。業務に対応する SQL の合理性についてはあまりこだわらないでください。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySql インデックスを表示および最適化する方法
  • Explainキーワードに基づいてMySQLインデックス機能を最適化する方法
  • インデックスを使用して MySQL ORDER BY ステートメントを最適化する方法
  • MySQL 関数インデックス最適化ソリューション
  • MySQL インデックスのパフォーマンス最適化の問題に対する解決策
  • MySQL パフォーマンスの最適化: インデックスを効率的かつ正しく使用する方法
  • MySQL インデックスクエリ最適化スキルを習得するための記事
  • MySQL データベースの最適化: インデックスの実装原則と使用状況の分析
  • MySQL 最適化における B ツリー インデックスの知識ポイントのまとめ
  • MySQL テーブルの読み取り、書き込み、インデックス作成、その他の操作の SQL ステートメントの効率最適化の問題を分析します。
  • MySQL Bツリーインデックスとインデックス最適化の概要についての簡単な説明
  • MySQLインデックス最適化分析に関する簡単な説明
  • MySQLインデックスを最適化する方法

<<:  Tomcat で複数の war パッケージを展開する方法と手順

>>:  vue+px2rem(rem適応)を使用してPCで大画面適応を実装するためのサンプルコード

推薦する

Ubuntu システムログで /var/log/messages を設定する方法

1. 問題の説明今日、システム ログ ファイルを確認する必要がありますが、/var/log/mess...

CSSの使用に関する深い理解 clear:both

clear:both清除浮動これは私が常に持っていた印象ですが、私はこれをめったに使用せず、私の理...

良いリファクタリングを行うには、コードをリファクタリングするだけでなく、人生をリファクタリングすることも重要です。

職業的な観点からも、人生の観点からも、良い再建をすることは本当に簡単ではありません。楽観的で熱心で前...

MySQL マスタースレーブレプリケーションの遅延の原因と解決策

目次レプリケーション ロジックの簡単な概要:遅延の原因と解決策〇メインデータベースへの頻繁なDMLリ...

Vue プロジェクトにインターフェース リスニング マスクを追加する方法

1. 事業背景マスク レイヤーを使用してユーザーの異常な操作を遮断する方法は、フロントエンドでよく使...

Nginx の負荷分散アルゴリズムとフェイルオーバー分析

概要Nginx ロード バランシングは、アップストリーム サーバー (実際のビジネス ロジックによっ...

Dockerにlogstashをインストールする詳細な手順

docker-compose.yml を編集し、次のコンテンツを追加します。 バージョン: '...

Nginx 構成 クロスドメイン リクエスト Access-Control-Allow-Origin * 詳細な説明

序文403 クロスオリジン エラーが発生しNo 'Access-Control-Allow-...

Linux (CentOS7) で RPM を使用して MySQL 8.0.11 をインストールするチュートリアル

目次1. インストールの準備1. Linux関連情報の表示(Linuxコマンドライン操作) 2. M...

Tomcatのクラスロードメカニズムのプロセスとソースコード分析

目次序文1. Tomcat クラスローダー構造図: 2. Tomcat のクラスロードプロセスの説明...

擬似分散グラフィックを実現するための VMware 構成 Hadoop チュートリアル

1. 実験環境シリアルナンバープロジェクトソフトウェアとバージョン1オペレーティング·システムCen...

Linux (Ubuntu 18.04) に vim エディタをインストールする方法

デスクトップ システムをダウンロードするには、Ubuntu の公式 Web サイト (https:/...

Linuxはnode.jsを完全に削除し、yumコマンドで再インストールします。

最初のステップ組み込みのパッケージ管理機能で一度削除する yum 削除 nodejs npm -y ...

フレームウィンドウ間の関連付けとハイパーリンクのターゲット属性の使用を実装する方法

フレーム ウィンドウの関連付けを実現するには、次に示すように、ハイパーリンクの「ターゲット」ウィンド...

4つの柔軟なScssコンパイル出力スタイル

多くの人は、Scss を使用する瞬間からコンパイル方法を説明されてきました。したがって、コマンドのコ...