MySQL インデックスがソートに与える影響の分析例

MySQL インデックスがソートに与える影響の分析例

この記事では、例を使用して、MySQL インデックスがソートに与える影響を説明します。ご参考までに、詳細は以下の通りです。

インデックスはクエリ速度を向上させるだけでなく、ソート速度も向上させます。order by の後のステートメントでインデックスを使用すると、ソート速度が向上します。

テスト

1. テストテーブルを作成する: t15 テーブル

テーブル `t15` を作成します (
 `id` int(10) 符号なし NOT NULL AUTO_INCREMENT,
 `cat_id` int(10) unsigned NOT NULL DEFAULT '0',
 `price` 小数点(10,2) NOT NULL デフォルト '0.00',
 `name` char(5) NOT NULL DEFAULT ''
 主キー (`id`)、
) エンジン=InnoDB デフォルト文字セット=utf8

2. 10,000行のデータを挿入する

<?php
$db = 'テスト';
ローカルホストに接続します。
mysql_query('use ' . $db , $conn);
mysql_query('名前をutf8に設定', $conn);
($i=1;$i<=10000;$i++) の場合 {
  1. 10 進数で表されたcat_idの値。
  価格 = ランド(1,50000);
  $name = substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ234565789'),0,5);
  $sql = sprintf("t15 値に挿入 (%d,%d,%f,'%s')",$i,$cat_id,$price,$name);
  mysql_query($sql, $conn);
}

3. ショッピングモールのウェブサイトでは通常、価格が特定のカテゴリごとに並べ替えられます。これをシミュレートして、同じ SQL ステートメントを実行してみましょう。

cat_id=1 の場合、t15 から name、cat_id、price を選択し、price で並べ替えます。

(1)最初にインデックスを追加しない

クエリ分析から、Extra でUsing filesortが使用されていることがわかります。これは、ファイルのソートが必要であることを示しています。

這里寫圖片描述

(2)(cat_id, price)列にインデックスを追加する

テーブル t15 を変更し、インデックス cp(cat_id,price) を追加します。

ここでのクエリ分析では、Extra は Using filesort を使用していません。つまり、インデックスを追加してからクエリを実行する SQL では、外部ソートは使用されず、インデックスソートが使用されます。インデックス自体がソートされるため、追加の order by は必要ありません。

這里寫圖片描述

4. 観測クエリ時間

這里寫圖片描述

Query_ID 1 のステートメントはインデックスを追加せずに実行され、Query_ID 3 のステートメントはインデックスを追加した後に実行されます。一方の実行時間は 0.013 秒で、もう一方の実行時間は 0.005 秒です。インデックスありの方が明らかに高速です。どこが高速かを見てみましょう。

Query_ID 1 の SQL ステートメントの詳細な時間のかかるグラフ:

這里寫圖片描述

Query_ID 3 の SQL ステートメントの詳細な時間消費図:

這里寫圖片描述

明らかに、Query_ID1 のSorting resultには 0.012 秒かかりますが、Query_ID2 のSorting resultには 0.000004 秒しかかかりません。このSorting resultがソート時間です。

結論:インデックスはソートの速度に一定の影響を与えます。そのため、実際の開発では、実際の状況に基づいてインデックスを策定し、ソートフィールドを可能な限りインデックスに追加する必要があります。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL インデックス操作スキルの概要」、「MySQL 共通関数の概要」、「MySQL ログ操作スキルの概要」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキルの概要」、および「MySQL データベース ロック関連スキルの概要」。

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL インデックス使用状況監視スキル (収集する価値あり!)
  • 複合主キーと複数列インデックスに遭遇した場合の MySQL 行ロックの詳細な説明
  • MySQLインデックスが使用されない状況のまとめ
  • インデックスは MySQL クエリ条件で使用されますか?
  • MySQLアカウントのIP制限条件を変更する方法
  • MySQL パーティションテーブルの制限と制約の詳細な説明
  • MySQLクエリステートメントは、クエリされる行の数を制限するためにlimitを使用します。
  • MySQL接続数が制限を超える問題の解決方法
  • MySQL インデックスの長さ制限の原理の分析

<<:  nginx パニック問題の解決方法の詳細な説明

>>:  簡単な計算機を実装する小さなプログラム

推薦する

HTML テーブル マークアップ チュートリアル (4): 境界線の色属性 BORDERCOLOR

テーブルを美しくするために、テーブルにさまざまな境界線の色を設定できます。基本的な構文<テーブ...

IDEA が MySQL データベースに接続できない問題の 6 つの解決策

この記事では、IDEA が MySQL データベースに接続できない問題に対する 6 つの解決策を主に...

MySQLにおける時刻日付型と文字列型の選択について

目次1. DATETIMEとTIMESTAMPの使用1. 類似点2. 相違点3. 選択2. varc...

Linux ドライバ開発でよく使われる関数 copy_from_user open read write の詳細な説明

目次Linux ドライバーの共通機能 (copy_from_user open read write...

FileZilla 425 FTP に接続できない (Alibaba クラウド サーバー) の解決策

Alibaba Cloud ServerがFTPに接続できないFileZilla 425 データ接続...

Navicat Premium が MySQL 8.0 に接続してエラー「1251」を報告する問題を解決する方法の分析

長い間何もしていなかった人は、努力をすると一生懸命働いていると思うようになります。 1. 問題Nav...

VMware仮想マシンを使用してUbuntu 20.04をインストールする完全なチュートリアル

Ubuntu は比較的人気のある Linux デスクトップ システムです。最近、Ubuntu 20....

ApacheのDjangoオンライン展開方法

環境: 1. Windows Server 2016 Datacenter 64 ビット 2. SQ...

CentOS7 のシステム サービスに Nginx を追加する方法

導入コンパイル、インストール、問題の解決後、Nginx は正常に動作していますが、現時点では Ngi...

MySQLでANDとORを組み合わせる問題を解決する

以下のように表示されます。 SELECT prod_name,prod_price FROM pro...

Docker で Node プロジェクトをビルドしてデプロイする方法

目次DockerとはクライアントサイドDocker基本的なDocker操作画像名画像をプルするその他...

CSS3 で z-index が効かない問題の解決方法

最近、CSS3 と js の組み合わせを作成したのですが、z-index が有効にならないケースが多...

Vueプロジェクトの支払い機能コードの詳細な説明

1. Alipay方式: Alipay メソッド: Alipay をクリックして支払い、バックエンド...

Dockerコンテナでアプリケーションサービスを自動的に起動する方法の例

コンテナの起動時に Docker コンテナ内のアプリケーション サービスを自動的に起動する場合。 D...

iview権限管理の実装

目次iview-admin2.0 組み込み権限管理権限に基づいてコンポーネントの表示を制御するカスタ...