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

推薦する

MySQL 8.0.22 winx64 のインストールと設定方法のグラフィックチュートリアル

MySQL-8.0.22-winx64のデータベースインストールチュートリアルは参考になります。具体...

中国語フォントの英語名まとめ

CSS の font-family プロパティを使用して中国語フォントを参照する場合、フォントを定義...

ZooKeeper をベースにした Hadoop 高可用性クラスタの構築のチュートリアル図

目次1. 高可用性の概要1.1 可用性の高い全体アーキテクチャ1.2 QJMに基づく共有ストレージシ...

Linux の MySQL でリモート接続を承認する方法

注意: 他のマシン (IP) は、承認なしではクライアント経由で MySQL データベースに接続でき...

シンプルなドラッグ効果を実現するJavaScript

この記事では、簡単なドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

Linux の vsftpd サービス構成の簡単な分析 (匿名、ユーザー、仮想ユーザー)

vsftpd の概要vsftpd は「very secure FTP daemon」の略称で、セキ...

意外と知らないJSのループ速度テストのいろいろを徹底解説

目次序文1. forループ2. whileループとdo-whileループ3. forEach、map...

MySQL パフォーマンス最適化のヒント

MySQL パフォーマンスの最適化MySQL はインターネット企業で広く使用されており、MySQL ...

MySQL パーティションテーブルの制限と制約の詳細な説明

ビルドを無効にするパーティション式では、次の構成はサポートされません。ストアドプロシージャ、ストアド...

MySQL の DOS ウィンドウの文字化け問題を解決する方法

文字化けしたコードの問題は次のとおりです。 この問題の原因は非常に単純です。コマンドラインのエンコー...

Vue ページに img 画像を導入する方法

HTMLを学ぶとき、画像タグ<img>は画像を導入します <img src=&qu...

CentOS 7.9 の zabbix5.0.14 のインストールと設定プロセス

目次1. 基本的な環境設定2. データベースをインストールする3. zabbix関連コンポーネントを...

VMWare12 グラフィックチュートリアルで Apple Mac OS X をインストールする

1. はじめに:友人はシステム知識を学びたいと考えており、Apple のラップトップを使用していまし...

Docker コンテナにデータベースをデプロイする場合の欠点は何ですか?

序文Docker は過去 2 年間で非常に人気が高まっています。開発者はすべてのアプリケーションとソ...

Angular CLI リリース パスの構成項目の簡単な分析

序文プロジェクトのリリースでは、常に特定の状況に応じたパッケージ化が必要です。Angular CLI...