ソート問題 最近、Geek Time の「45 Lectures on MySQL Practice」を読み、InnoDB セカンダリ インデックスに関する不十分な理解を修正しました。関連する内容を要約する良い機会です。 PS:この記事のすべてのテストは MySQL 8.0.13 に基づいています。 まず質問させてください。次の SQL によって作成されたテーブルには 2 つのクエリ ステートメントがあります。どのインデックスが不要でしょうか。 テーブル `geek` を作成します ( `a` int(11) NULLではない、 `b` int(11) NULLではない、 `c` int(11) NULLではない、 `d` int(11) NULLではない、 主キー (`a`,`b`)、 キー `c` (`c`)、 キー `ca` (`c`,`a`)、 キー `cb` (`c`,`b`) )ENGINE=InnoDB; c=N で geek から * を選択し、制限 1 で順序付けします。 c=N で geek から * を選択し、b で順序を制限し、1 にします。 著者の答えは、インデックス c と ca のデータ モデルは同じなので、ca は冗長であるというものです。なぜ? ? セカンダリ インデックスには行の位置ではなくプライマリ キーの値が格納され、インデックスは順序付けられていることもわかっています。 c が ca と同じデータ モデルを持つ場合、セカンダリ インデックスのリーフ ノードは、インデックス列だけでなく、関連付けられているプライマリ キー値でも並べ替える必要があります。 以前の私の理解では、セカンダリ インデックスはインデックス列によってのみソートされ、プライマリ キーの値はソートされないというものでした。 コラムニストに尋ねたところ、次のような答えが返ってきました。インデックス c は cab (セカンダリ インデックス) のようにソートされ、主キーが含まれ、順序どおりになっていることを確認します。 (追記:これは原文ではありません。3回質問してやっと答えが分かりました)。 まず「かどうか」を問い、次に「なぜ」を問うという考えに基づいて、私たちはいくつかの調査を行いました。 はい、もしくは、いいえ? InnoDB データファイルを直接表示できる場合は、このソートルールに従っているかどうかを直接確認できます。残念ながらバイナリファイルなので、閲覧するのに便利なツールもないので諦めました。 その後、MyISAM エンジンと InnoDB エンジンの両方のテーブルをサポートする MySQL ハンドラー ステートメントを見つけました。ハンドラー ステートメントは、テーブル ストレージ エンジンに直接アクセスするためのインターフェイスを提供します。 次の構文は、指定されたテーブル内の指定されたインデックスの最初/前/次/最後のレコードを読み取ることを示します。 ハンドラー table_name/table_name_alias は index_name first/pre/next/last を読み取ります。 ハンドラー ステートメントを使用して検証してみましょう。まず、単純なテーブルを作成し、いくつかのデータを挿入します。 テーブル t_simple を作成します ( id int 主キー、 v 整数、 キー k_v (v) )ENGINE=InnoDB デフォルト文字セット=utf8mb4; t_simpleに値(1、5)を挿入します。 t_simpleに値(10、5)を挿入します。 t_simpleに値(4、5)を挿入します。 上記の挿入ステートメントでは、セカンダリインデックス列の値は同じであり、プライマリキーの順序が合っていません。このようにして、トラバーサル中にプライマリキーの順序で格納されているかどうかを確認できます。 mysql> ハンドラー t_simple を ts として開きます。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) mysql> ハンドラ ts 読み取り k_v 次へ; +----+------+ | id | v | +----+------+ | 1 | 5 | +----+------+ セット内の 1 行 (0.00 秒) mysql> ハンドラ ts 読み取り k_v 次へ; +----+------+ | id | v | +----+------+ | 4 | 5 | +----+------+ セット内の 1 行 (0.00 秒) mysql> ハンドラ ts 読み取り k_v 次へ; +----+------+ | id | v | +----+------+ | 10 | 5 | +----+------+ セット内の 1 行 (0.00 秒) 結果から、トラバースされたセカンダリインデックスの値が等しい場合、プライマリキーの順序でトラバースしていることがわかります。セカンダリインデックスは、インデックス列だけでなく、プライマリキーの値でもソートされていることを基本的に判断できます。 なぜ? これまで MySQL でこのようなメカニズムについて言及されているのを見たことがありませんでしたし、以前の会社やその前の会社の DBA もこのことに気づいていませんでした。 最後に、DBA の同僚は、次の説明を含むインデックス拡張を見つけました。
テーブルt1を作成します( i1 INT NOT NULL デフォルト 0, i2 INT NOT NULL デフォルト 0, d 日付デフォルト NULL、 主キー (i1, i2) インデックスk_d(d) )エンジン = InnoDB; InnoDB は各セカンダリ インデックスを自動的に拡張し、プライマリ キー値をインデックス列に追加し、拡張された複合列をインデックスのインデックス列として使用します。上記の t_simple テーブルの k_v インデックスの場合、拡張インデックスは (v, id) 列です。 オプティマイザーは、拡張セカンダリ インデックスの主キー列に基づいて、そのインデックスを使用するかどうか、およびその使用方法を決定します。オプティマイザーは、ref、range、index_merge などのインデックス アクセス タイプ、ルーズ インデックス スキャン、結合およびソートの最適化、min()/max() の最適化に拡張セカンダリ インデックスを使用できます。 インデックス拡張機能が有効になっているかどうかを確認するには、 テストの結果、現在のセッションのインデックス拡張がオフになっている場合でも、ハンドラーを使用してアクセスすると、主キーによるソートの効果が得られることがわかりました。 要約する 上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。 以下もご興味があるかもしれません:
|
<<: VMware15 の CentOS7 インストールの詳細なプロセスとよくある問題 (画像とテキスト)
>>: JS の 3 つの主要な問題、非同期性とシングルスレッドについて簡単に説明します。
Docker-ComposeとはCompose プロジェクトは、以前の fig プロジェクトから派生...
MySQL Community Server 5.7.18 の配布パッケージには .ini ファイル...
序文要素がビューポート内にあるかどうかを監視する2つの方法を共有する1. 位置計算Element.g...
Iframe Web ページのナビゲーション ウィンドウに関する簡単な説明 Iframe ウェブペー...
最近、小さなプログラムを書いています。その小さなプログラムの公式ウェブサイトはhttpsを使用する必...
目次序文アイデアの起動速度Tomcat ログが文字化けしている序文Idea を再インストールしたので...
最近、HTML を再度学習しており、これは HTML に対する新たな理解と言えます。これを過小評価し...
最近、複数のdivにあるテーブルのTDを同じ幅に調整しても、揃えることができず、幅にパターンがないこ...
序文: Vueプロジェクトで透かし効果を使用するには、コンテナを指定できます効果画像: 1. コンテ...
序文MySQL の日常的な開発やメンテナンスでは、パスワードの紛失やテーブルの破損など、避けられない...
ビジネスシナリオの要件と実装ロジックの分析ビジネスでは、HTTP GET を使用してデータを要求する...
MySQL では、datetime 型は通常、時間を保存するために使用されますが、現在では多くのシス...
MySQL データベースでは、null は一般的な状況です。MySQL での null に関する注意...
2日前に新しい会社に入社しました。その会社ではIntelli Ideaを使っています。Eclipse...
この記事では、参考までに、簡単な計算機を実装するためのJavaScriptの具体的なコードを紹介しま...