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

推薦する

JSはカード配布アニメーションを実現します

この記事の例では、カード配布アニメーションを実装するためのJSの具体的なコードを参考までに共有してい...

dockerがredisを再起動するとmysqlデータが失われる問題を解決する

公式ドキュメント:したがって、mysql は次のように起動する必要があります。 docker run...

Ubuntu でディスク容量不足により MySQL が起動しない場合の解決策

序文最近、データベースのテーブルに 2 つのフィールドを追加しました。その後、ディスク容量不足のよう...

CocosCreator でレイヤー管理に常駐ノードを使用する方法

CocosCreator バージョン: 2.3.4ほとんどのゲームにはレイヤー管理機能があり、例えば...

MySQLテーブルにタイムスタンプを追加するいくつかの方法

シナリオ:テーブル内のデータは、同期ツールを使用して他のデータベースと同期する必要があり、増分同期に...

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

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

Vueのトランジションとアニメーションの深い理解

1. DOM要素を挿入、更新、または削除するときに、適切な場合は要素にスタイルクラス名を追加します。...

mysql5.7.24 バージョンのインストール手順と解凍時に発生した問題の概要

1. ダウンロード参考: 2. D:\MySQL\mysql-5.7.24 などの固定の場所に解凍し...

正の整数かどうかを判断するMYSQLカスタム関数の例コード

関数を記述できます。主に正規表現を使用して判断を行います。入力文字が空の場合は、「-」を使用して置き...

Linux でのプロセスデーモン スーパーバイザーのインストール、構成、および使用

Supervisor は非常に優れたデーモン管理ツールです。自動起動、ログ出力、自動ログカットなど、...

Pengyou.com モバイル クライアントのダウンロード ページのデザイン共有 (画像とテキスト)

まずは簡単なデータを見てみましょう。 Googleが発表したレポートによると、 ①中国の都市の97%...

CSS3 で実装された画像ホバートグルボタン

結果:実装コードhtml <ul class="スライド"> <...

VMware CentOS 仮想マシンのインストールとネットワーク構成のグラフィックチュートリアル

1. CentOSイメージをダウンロードする1.1 ダウンロードウェブサイトhttp://mirro...

Dockerの核となる原則であるCgroupの詳細な説明

カーネル内の強力なツール cgroup は、NameSpace によって分離されたリソースを制限でき...

オンデマンドで Vue コンポーネントを自動的にインポートする方法

目次グローバル登録部分登録ローカル自動登録さまざまなソリューションの比較コンポーネント名について参照...