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で大画面適応を実装するためのサンプルコード

推薦する

Reactの状態の理解についての簡単な分析

複雑なコンポーネント (クラス コンポーネント) と単純なコンポーネント (関数コンポーネント) を...

vue3 学習ノートにおける axios の使用の変更の概要

目次1. axioの基本的な使い方2. クロスドメインの問題を解決するには? 3. パッケージ4. ...

ウェブページレイアウトデザインのシンプルな原則

この記事では、Web ページ レイアウト デザインのいくつかの簡単な原則をまとめ、Web ページ デ...

CSS3はアニメーション効果を実現するためにvar()とcalc()関数を使用する。

ナレッジポイントをプレビューします。アニメーションフレーム背景グラデーションvar() と calc...

ウェブデザインにおける階層化インターフェースの設計経験

多くのネットユーザーは、なぜ自分のウェブサイトはいつも色の問題を抱えていて、いつも地味に見え、注目を...

MySQLのロック機構に関する最も包括的な説明

目次序文グローバルロック完全なデータベース論理バックアップFTWRL と set global re...

MySQL データベースのエンコーディングを utf8mb4 に変更する方法

utf8mb4 エンコーディングは utf8 エンコーディングのスーパーセットであり、utf8 と互...

mysql8.0.11データディレクトリ移行の実装

mysql のデフォルトのストレージ ディレクトリは/var/lib/mysql/です。以下は、デフ...

mysql8.0.12 でルートパスワードをリセットする方法

データベースをインストールした後、誤ってインストール ウィンドウを閉じたり、長期間 root ユーザ...

HTML 選択オプションの基本的な理解と使用

JavaScript での HTML (選択オプション) の詳細な説明1. 基本的な理解:コードをコ...

2008 年の Web デザインにおける 10 の経験

<br />インターネットは絶えず変化しており、BusinessWeek.com は専門...

ActiveMQ メッセージ サービスを構築するための Docker 学習方法の手順

序文ActiveMQ は、Apache が開発した最も人気があり強力なオープン ソース メッセージ ...

Docker に共通コンポーネント (mysql、redis) をインストールする方法

Dockerはmysqlをインストールします docker search mysql 検索 dock...

MySQL方言の簡単な紹介

データベースはさておき、人生における方言とは何でしょうか?方言とは、ある場所特有の言語です。他の場所...

NavicatがMySQLに接続すると、10060、1045エラーとmy.iniの場所が報告されます。

Navicat は、データベースに接続するときにエラー 10060 および 1045 を報告します...