検索

Mysql-index データ構造

Jan 20, 2017 pm 05:03 PM

1. はじめに:

私たちの生活の中で、駅で見る電車の時刻表や辞書ディレクトリなど、インデックス効果を確認できるアプリケーションをエクスポートします。それらの機能はインデックスの機能であり、取得するデータの範囲を継続的に絞り込むことで最終的に望ましい結果をフィルタリングし、同時にランダムなイベントを連続したイベントに変換します。つまり、常に同じ検索方法を使用して、データをロックします (辞書の A-Z 検索)。

人生の例 - 電車に乗る: 電車に乗って故郷に帰ります。電車に乗りたいときに電車の時刻表がなかったら、最悪の結果は、すべての電車の停留所に行かなければならないことです。乗りたい電車があるのに、時刻表があると行きたい電車がどこに止まるのかがすぐに分かり、行きたい電車をいちいち確認する必要がなく、すぐにそこに行くことができるのでスピードアップします。訪問。この列車時刻表はデータベースのインデックスです。


2. ディスク原理:

この部分は文章理論が多く、読むだけで頭が痛くなります。興味があれば読んでください。この部分の結論を 1 つ覚えておいてください:

可能な限りデータを読み取る [オペレーティング システムとの I/O 対話の数を減らす]。

興味がない場合は、スキップして次のパートに進んでください。

データベースの実装は比較的複雑であり、パフォーマンスを向上させるために、毎回データの一部をメモリに読み込むことができます。メモリへのアクセスの 100,000 倍であるため、検索ツリーは複雑なアプリケーション シナリオに対応することが困難です。ディスクへのアクセスについては前述したので、ここではディスク IO と事前読み取りについて簡単に説明します。データの読み取りにかかる時間は、シーク時間、回転遅延の 3 つのカテゴリに分類されます。 、および送信時間、
a) · シーク時間: 磁気アームが指定されたトラックに移動するのに必要な時間、主流のディスクは通常 5 ミリ秒未満です。 b) 回転遅延: よく聞くディスク速度です。 7200 rpm のディスクなど、1 分間に 7200 回回転できることを意味します。つまり、回転遅延は 1/120/2 = 4.17 ミリ秒になります。ディスクからのデータの読み取りまたはディスクへのデータの書き込みにかかる時間は、通常は 10 分の 1 ミリ秒以内で、最初の 2 回に比べて無視できます。
(非常に詳細な記事を読みました: http://wdxtub.com/2016/04/16/thin-csapp-3/)

すると、ディスクにアクセスする時間、つまりディスク IO の時間は5 + 4.17 = 約 9 ミリ秒に相当します。これはかなり良いように思えますが、命令は自然などの電気に依存するため、500 MIPS (1 秒あたりの命令数) のマシンは 1 秒あたり 5 億命令を実行できることを知っておく必要があります。つまり、1 つの IO を実行するには 400,000 の命令が必要であり、そのたびに 9 ミリ秒かかるのは明らかに大惨事です。

結論としては、オペレーティング システムの I/O インタラクションの数を減らします。

(毎回 IO によって読み取られるデータをページと呼びます。ページ上のデータの具体的なサイズはオペレーティング システムによって異なりますが、通常は 4k または 8k です。つまり、ページ内のデータを読み取るとき、実際のデータは 1 つだけです前回は IO が発生しました)

3. インデックスとは:

データベース システムを使用する過程で、データ クエリは最も頻繁に使用されるデータ操作です。

最も基本的なクエリ アルゴリズムは、もちろん、テーブルを走査し、行の値が検索するキーワードと等しいかどうかを行ごとに照合します。その時間計算量は O(n) です。ただし、時間計算量が O(n) のアルゴリズムは、小さなテーブルや負荷の軽いデータベースでも良好なパフォーマンスを達成できます。しかし、データが増加すると、時間計算量が O(n) のアルゴリズムは明らかに悪く、パフォーマンスは急速に低下します。

幸いなことに、コンピューターサイエンスの発展により、二分探索や二分探索など、より優れた検索アルゴリズムが数多く提供されました。 木探索)など少し分析すると、各検索アルゴリズムは特定のデータ構造にのみ適用できることがわかります。たとえば、二分探索では取得したデータを順序付けする必要がありますが、二分木検索では二分探索木にのみ適用できます。データ自体 組織構造はさまざまなデータ構造を完全に満たすことはできません (たとえば、両方の列を同時に順番に整理することは理論的に不可能です)。そのため、データベース システムはデータに加えて、特定の検索を満たすデータ構造も維持します。アルゴリズム。構造は何らかの方法でデータを参照 (ポイント) し、これらのデータ構造に高度な検索アルゴリズムを実装できます。このデータ構造がインデックスです。


4. MySQL の B-Tree インデックス (技術的には B+Tree)

さて、ここからがこの記事の核心です。

MySQL には、B ツリー インデックス、ハッシュ インデックス、フルテキスト インデックス、R ツリー インデックスという 4 つの主なタイプのインデックスがあります。主にB-Treeインデックスを分析します。 (B: バランスとはバイナリツリーではなくバランスを意味します)

1. b+ ツリーのデータ構造の詳細な説明

Mysql-index データ構造

上の図は b+tree です (innodb エンジンの下では、myisam エンジンの下の B+ 構造とは異なります。端的に言えば、クラスター化インデックスと非クラスター化インデックスの違いです。詳細については、を参照してください) :

Mysql-cluster クラスター インデックス

水色のブロックはディスク ブロックと呼ばれ、各ディスク ブロックには複数のデータ項目 (濃い青で表示、範囲: [(M/2)-1, M-) が含まれていることがわかります。たとえば、ディスク ブロック 1 にはデータ項目 17 と 35 が含まれ、P1 は 17 未満のディスク ブロックを表し、P2 はデータ項目を表します。 17 ~ 35 のディスク。ブロック、P3 は 35 より大きいディスク ブロックを表します。実際のデータはリーフ ノード、つまり 3、5、9、10、13、15、28、29、36、60、75、79、90 に存在します。 , 99 のみ。実際のデータ (B+ の特徴) は保存されません。たとえば、17 と 35 は実際にはデータ テーブルに存在しません。 B+ ツリー

の検索プロセスは、図に示すように、データ項目 29 を検索する場合、まずディスク ブロック 1 をディスクからメモリにロードします。このとき、IO が発生します。メモリ内でバイナリ検索を実行し、29 が 17 ~ 35 の間にあることを確認し、ディスク ブロック 1 の P2 ポインタをロックします。ディスク ブロック 3 がロードされるのと比較して非常に短いため、メモリ時間は無視できます。ディスク ブロック 1 の P2 ポインタのディスク アドレスを介してディスクをメモリにロードします。2 番目の IO が発生し、29 は 26 と 30 の間にあり、ディスク ブロック 3 の P2 ポインタをロックし、ポインタを介してディスク ブロック 8 をメモリにロードします。同時に、3 番目の IO がメモリ内で実行され、29 が見つかり、クエリは終了します。実際には、b+ ツリーは数百万のデータを表す可能性があります。数百万回のデータ検索に必要な IO は 3 回だけですが、インデックスがない場合、各データ項目に 1 回の IO が必要になるため、合計 100 万回の IO が必要となり、明らかにコストが高くなります。 、非常に高いです

(質問???、前述したように、INNOBD の B+ ツリーはクラスター化インデックス タイプであり、実際のデータとインデックスのリーフ ノードがまとめられているため、問題は、私がどのくらい弱いかということです。それは可能ですか?各インデックスの下にデータが格納されているということですか? そうでない場合は、データ構造を使用してそれを表現する方法を教えてください。各テーブルにはクラスター化インデックスが 1 つだけあり、補助インデックスは複数ありません。データではなく、データが保存されているプラ​​イマリ インデックスを指すポインターです。

1) 上記の分析を通じて、IO の数は b+ の高さ h に依存することがわかります。現在のデータテーブルのデータを N とし、各ディスクブロックのデータ数を m とすると、データ量 N が一定の場合、m が大きくなるほど h=㏒(m +1)N となります。 、h と m が小さい方。 = ディスク ブロックのサイズ / データ項目のサイズ。ディスク ブロックのサイズはデータ ページのサイズであり、データ項目が占有するスペースが小さい場合、データ項目の数は次のようになります。より多くなり、ツリーの高さ h も低くなります。I/O も少なくなります。このため、各データ項目、つまりインデックス フィールドはできるだけ小さくする必要があります。

たとえば、負の例を挙げると、int は 4 バイトを占めますが、これは bigint の 8 バイトの半分です。これが、b+ ツリーが実際のデータを内部ノードではなくリーフ ノードに配置する必要がある理由です。内部ノードに配置されると、ディスク ブロックのデータ項目が大幅に減少し (上記のパート 2 の原理を参照)、ツリーが身長の増加。データ項目が 1 の場合、線形テーブルに縮退します。以下の通りです。

左の構造であれば I/O 回数は 3 回、右の線形テーブルであれば I/O 回数は 6 回であることがわかります。より多くの IO があること

結論:

1. インデックスとして設定するフィールド len は小さくする必要があります

Mysql-index データ構造2. ジョイント インデックスを実行する場合、ジョイント フィールドの数も小さくする必要があります。


2) b+ ツリーのデータ項目が複合データ構造 (複数列インデックス) である場合、(名前、年齢、性別)、b+ 数値が検索の構築に使用されます。左から右の順にツリーを作成します。

たとえば、(Zhang San, 20, F) のようなデータが取得された場合、b+ ツリーは最初に名前を比較して次の検索方向を決定します。名前が同じ場合は、年齢と性別を順に比較します。そして最後に取得したデータを取得します。しかし、(20,F) のような名前のないデータが来ると、b+ ツリーは次にどのノードをチェックすればよいのかわかりません。これは、検索ツリーを確立するときに名前が最初の比較要素であり、それが必要であるためです。最初に名前に基づいて検索し、次にどこを探すかを確認します。

たとえば、(Zhang San, F) のようなデータを取得する場合、b+ ツリーは名前を使用して検索方向を指定できますが、次のフィールド age が欠落しているため、名前が Zhang と等しいすべてのデータしか検索できません。 San、次に性別の一致は F のデータです。これは非常に重要なプロパティ、つまりインデックスの左端の一致特徴です。



2 つの結論をマップします。

1. 左端の一致する特徴、結合インデックスは左から右に読み取られます

2. 複数列のインデックスがある場合、左からインデックスを作成する必要はありません。右へ (a,b,c) したがって、(a)、(a,b) を確立する必要はありません

3. さらなる結論: Mysql-index の概要 http://blog.csdn.net/ty_hf/article/details/53526405

上記は Mysql-index データ構造の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) を参照してください。 )!

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
MySQL Index Cardinalityはクエリパフォーマンスにどのように影響しますか?MySQL Index Cardinalityはクエリパフォーマンスにどのように影響しますか?Apr 14, 2025 am 12:18 AM

MySQLインデックスのカーディナリティは、クエリパフォーマンスに大きな影響を及ぼします。1。高いカーディナリティインデックスは、データ範囲をより効果的に狭め、クエリ効率を向上させることができます。 2。低カーディナリティインデックスは、完全なテーブルスキャンにつながり、クエリのパフォーマンスを削減する可能性があります。 3。ジョイントインデックスでは、クエリを最適化するために、高いカーディナリティシーケンスを前に配置する必要があります。

MySQL:新規ユーザー向けのリソースとチュートリアルMySQL:新規ユーザー向けのリソースとチュートリアルApr 14, 2025 am 12:16 AM

MySQL学習パスには、基本的な知識、コアの概念、使用例、最適化手法が含まれます。 1)テーブル、行、列、SQLクエリなどの基本概念を理解します。 2)MySQLの定義、作業原則、および利点を学びます。 3)インデックスやストアドプロシージャなどの基本的なCRUD操作と高度な使用法をマスターします。 4)インデックスの合理的な使用や最適化クエリなど、一般的なエラーのデバッグとパフォーマンス最適化の提案に精通しています。これらの手順を通じて、MySQLの使用と最適化を完全に把握できます。

実際のmysql:例とユースケース実際のmysql:例とユースケースApr 14, 2025 am 12:15 AM

MySQLの実際のアプリケーションには、基本的なデータベース設計と複雑なクエリの最適化が含まれます。 1)基本的な使用法:ユーザー情報の挿入、クエリ、更新、削除など、ユーザーデータの保存と管理に使用されます。 2)高度な使用法:eコマースプラットフォームの注文や在庫管理など、複雑なビジネスロジックを処理します。 3)パフォーマンスの最適化:インデックス、パーティションテーブル、クエリキャッシュを使用して合理的にパフォーマンスを向上させます。

MySQLのSQLコマンド:実用的な例MySQLのSQLコマンド:実用的な例Apr 14, 2025 am 12:09 AM

MySQLのSQLコマンドは、DDL、DML、DQL、DCLなどのカテゴリに分割でき、データベースとテーブルの作成、変更、削除、データの挿入、更新、削除、複雑なクエリ操作の実行に使用できます。 1.基本的な使用には、作成可能な作成テーブル、INSERTINTO INSERTデータ、クエリデータの選択が含まれます。 2。高度な使用法には、テーブル結合、サブQueries、およびデータ集約のためのグループに参加します。 3.構文エラー、データ型の不一致、許可の問題などの一般的なエラーは、構文チェック、データ型変換、許可管理を介してデバッグできます。 4.パフォーマンス最適化の提案には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、およびデータの一貫性を確保するためのトランザクションの使用が含まれます。

InnoDBは酸コンプライアンスをどのように処理しますか?InnoDBは酸コンプライアンスをどのように処理しますか?Apr 14, 2025 am 12:03 AM

INNODBは、ロックメカニズムとMVCCを通じて、非論的、一貫性、および分離を通じて原子性を達成し、レッドログを介した持続性を達成します。 1)原子性:Undologを使用して元のデータを記録して、トランザクションをロールバックできることを確認します。 2)一貫性:行レベルのロックとMVCCを介してデータの一貫性を確保します。 3)分離:複数の分離レベルをサポートし、デフォルトでrepeatable -readが使用されます。 4)持続性:Redologを使用して修正を記録し、データが長時間保存されるようにします。

MySQLの場所:データベースとプログラミングMySQLの場所:データベースとプログラミングApr 13, 2025 am 12:18 AM

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

MySQL:中小企業から大企業までMySQL:中小企業から大企業までApr 13, 2025 am 12:17 AM

MySQLは、中小企業に適しています。 1)中小企業は、顧客情報の保存など、基本的なデータ管理にMySQLを使用できます。 2)大企業はMySQLを使用して、大規模なデータと複雑なビジネスロジックを処理して、クエリのパフォーマンスとトランザクション処理を最適化できます。

Phantomの読み取りとは何ですか?Innodbはどのようにそれらを防ぐ(次のキーロック)?Phantomの読み取りとは何ですか?Innodbはどのようにそれらを防ぐ(次のキーロック)?Apr 13, 2025 am 12:16 AM

INNODBは、次のキーロックメカニズムを通じてファントムの読み取りを効果的に防止します。 1)Next-KeyLockingは、Row LockとGap Lockを組み合わせてレコードとギャップをロックして、新しいレコードが挿入されないようにします。 2)実際のアプリケーションでは、クエリを最適化して分離レベルを調整することにより、ロック競争を削減し、並行性パフォーマンスを改善できます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境