sakilaをインストールするMySQL サンプル データベース sakila を使用して、SQL のデモンストレーションと説明を行います (dev.mysql.com/doc/sakila/…)。 インデックススキャンソートMySQL には、並べ替え操作による方法とインデックス順序でのスキャンによる方法の 2 つの方法で順序付けられた結果を生成します。EXPLAIN によって出力される type 列の値が「index」の場合、MySQL は並べ替えにインデックス スキャンを使用していることを意味します。 テーブル構造レンタルテーブルを使って説明します テーブル「レンタル」を作成します( 一意のキー `rental_date` (`rental_date`,`inventory_id`,`customer_id`)、 キー `idx_fk_inventory_id` (`inventory_id`)、 キー `idx_fk_customer_id` (`customer_id`)、 キー `idx_fk_staff_id` (`staff_id`)、 ) ENGINE=InnoDB AUTO_INCREMENT=16050 デフォルトCHARSET=utf8mb4; Extra に Using filesort が表示されているかどうかを確認します (MySQL ではインデックスを使用して完了できないソート操作は「ファイル ソート」と呼ばれます)。インデックスなしでフィールドをソートしようとすると、filesort になります。中にファイルがありますが、ファイルとは何の関係もありません。実際は内部のクイックソートです。 インデックススキャンをソートに使用できる状況先頭の列に記入してくださいORDER BY 句がインデックスの左端のプレフィックス要件を満たす必要がないケースが 1 つあります。つまり、先頭の列が定数である場合です。 WHERE 句または JOIN 句でこれらの列に定数を指定すると、インデックスの不足を「補う」ことができます。 Sakilaデータベースを使用してテストします 見ることができます 本の中のExtraではUsing whereと書いてあるのですが、実行してみたところUsing index conditionを使ってしまいました。理由は、高性能MySQLで使われているバージョンが5.5であり、バージョン5.6でのindex condition pushdownがまだ正式リリースされていない段階だからです。ここでファイルソートが行われない理由は、rental_date = '2005-05-25' という定数条件があるためです。これは、インデックスの最初の列を埋めることと同等であり、インデックスの左端のプレフィックス要件を満たします。 並べ替えには1つの並べ替えのみが含まれますSELECT rental_id, staff_id FROM sakila.rental WHERE rental_date = '2005-05-25' ORDER BY inventory_id desc 見ることができます この本で使用されている条件は rental_date>'2005-05-25' であることに注意してください。 WHERE rental_date > '2005-05-25' ORDER BY rental_date, inventory_id 現時点では、インデックス ソートを使用することはできませんが、テーブル全体を直接スキャンしてソートします。その理由は、返されるデータ項目が多すぎるため、現時点ではインデックス クエリを使用するのはコスト効率が良くないからです。 ここでの説明の行数は正確ではなく、あくまでも推定値であることに注意してください。実際には、この条件によると、クエリには16036のデータ項目があります。この問題を解決するには、制限を追加する必要があります。 SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date > '2005-05-25' ORDER BY rental_date, inventory_id limit 0,10 対応する実行計画 インデックスが使用されていることがわかります インデックススキャンが使用できない状況クエリ条件に異なる並べ替え方向が含まれていますSELECT rental_id, staff_id FROM sakila.rental WHERE rental_date = '2005-05-25' ORDER BY inventory_id desc, customer_id asc インデックスの両方の列は昇順になっています。順序付けでは、1 つの列が昇順で、もう 1 つの列が降順になっているため、2 次ソートが必要になります。 クエリ条件はインデックスにない列を参照していますSELECT rental_id, staff_id FROM sakila.rental WHERE rental_date ='2005-08-23 21:01:09' ORDER BY inventory_id ,staff_id 左端の接頭辞を結合できない場合SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date ='2005-08-23 21:01:09' ORDER BY customer_id 最初の列がクエリ範囲の場合SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date > '2005-08-22' ORDER BY inventory_id,customer_id 複数の同等の条件がある場合SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date ='2005-08-23 21:01:09' and inventory_id in(1,2) ORDER BY customer_id 簡単に言えば、インデックスの左端のプレフィックスに一致しないものがソートされます。 要約する今日は、MySQL のインデックス スキャン ソートについて説明しました。明日は、引き続き、高パフォーマンス インデックスを構築する他の方法について紹介します。次回の記事もお楽しみに! 上記はMySQLインデックススキャンの簡単な使用方法の詳細内容です。MySQLインデックススキャンソートの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: ウェブサイトデザインの経験 ウェブサイト構築におけるよくある間違いのまとめ
>>: Zabbix 監視 Docker アプリケーション構成
目次例示する1. Dockerリモートアクセスを有効にする2. Dockerに接続する3. イメージ...
(1)HTTPリクエストを減らす。 (リソース ファイルをマージし、イメージ スプライトを使用します...
目次前提条件DNSドメイン名解決プロセス外部ネットワークマッピングnginxコア知識nginxとはア...
この記事では、ログイン認証コードを実装するためのvueの具体的なコードを例として紹介します。具体的な...
この記事では主にvue-routerのmatchedをベースにしたbreadcrumb機能を紹介し、...
1 Dockerサービスを開始するまず、docker サービスを開始する方法を知っておく必要がありま...
今日、ふとリッチテキストエディタの制作原理を見直してみようと思いました。それで、彼は何も言わずにそれ...
文法以下は、MySQL テーブルにデータを挿入するための INSERT INTO コマンドの一般的な...
シンプルなSpring Boot Webプロジェクトを作成するアイデア ツールを使用して、Sprin...
最近、会社でアプリを開発する準備をしており、最終的に開発には uni-app フレームワークを使用す...
この記事では、Xshell と関連する構成の一般的な問題について説明します。この記事の構成は、主に ...
記録として、将来使用される可能性があり、困っている友人も使用できます。 BBはもうやめて、まずはレン...
この記事では、呼吸カルーセル効果を実現するためのjQueryの具体的なコードを参考までに共有します。...
目次1. パーティクルエフェクト2. シーンを読み込む3. さまざまな粒子効果の実現エンディング: ...
自己学習型ゲーム開発の道において、最も充実した瞬間は、自分でミニゲームを作り、友達と共有して試しにプ...