序文 MySQL インデックスの使用に関しては、これまでインデックスの最左接頭辞ルール、インデックス カバレッジ、ユニーク インデックスと共通インデックスの使用、オプティマイザによるインデックスの選択などの概念を紹介してきました。今日は、文字列のインデックスをより合理的に作成する方法について説明します。 文字列インデックスをより良く作成する方法 MySQL では、データとインデックスはすべて B+ ツリー上にあることがわかっています。インデックスを作成するときに、ツリーが占めるスペースが小さいほど、検索速度が速くなります。varchar 形式の文字列の中には非常に長いものもあります。では、効率が最優先される今日の世界では、文字列インデックスをより合理的に作成するにはどうすればよいでしょうか。 インデックスを作成するには 2 つの方法があります。 1. 電子メール フィールドのインデックスを直接作成します。alter インデックスツリー構造は次のとおりです。 2. 電子メールのプレフィックスインデックスを作成します。alter インデックスのデータ構造は次のとおりです。 現時点でのクエリ ステートメントは次のとおりです: index1 を使用する場合の実行手順は次のとおりです。 1. インデックス値が [email protected] である主キー値 ID1 を index1 インデックス ツリーから検索します。 2. ID1 に基づいてテーブルに戻り、データ行が実際に [email protected] であることを確認します。結果を結果セットに追加します。 3. index1 インデックス ツリーの次のインデックス値が [email protected] を満たすかどうかの検索を続けます。満たさない場合は、クエリを終了します。 index2 を使用する場合の実行手順は次のとおりです。 1. index2 インデックス ツリーからインデックス値 zhangs を持つ主キー値 ID1 を検索します。 2. ID1 に基づいてテーブルに戻り、データ行が実際に [email protected] であることを確認します。結果を結果セットに追加します。 3. index2 インデックス ツリーの次のインデックス値が zhangs を満たすかどうかの検索を続けます。満たしている場合は、テーブルに戻って行データが [email protected] であるかどうかを照会し続けます。満たしていない場合は、スキップして検索を続けます。 4. インデックス値が zhangs でなくなるまで、index2 インデックス ツリーの検索を続けます。 上記の分析から、フルフィールドインデックスはプレフィックスインデックスと比較してテーブルリターンの数を減らすことがわかります。ただし、プレフィックスを6から7または8に増やすと、プレフィックスインデックステーブルリターンの数は減少します。つまり、プレフィックスの長さが定義されている限り、スペースを節約し、効率を確保できます。 そこで疑問になるのが、プレフィックス インデックスの長さをどのように測定するかということです。 1. 2. 異なるプレフィックス長を順番に選択して、異なる値の数を表示します。 選択 count(distinct left(email,4))をL4として、 count(distinct left(email,5))をL5として、 count(distinct left(email,6))をL6としてカウントし、 count(distinct left(email,7))をL7としてカウントし、 t から; 次に、実際の許容損失率に応じて、最も短い適切なプレフィックス長が選択されます。 プレフィックス長の問題は解決しましたが、プレフィックス インデックスを使用すると、インデックス カバレッジ機能が使用されなくなるという問題があります。 ただし、プレフィックス インデックスを使用する場合、MySQL はプレフィックスが電子メール値全体をカバーするかどうかを認識しません。完全に含まれているかどうかに関係なく、主キー値に基づいてテーブルをクエリすることによって決定されます。 したがって、プレフィックス インデックスを使用すると、スペースを節約して効率を確保できますが、カバーリング インデックスの特性を活用できません。使用するかどうかは、具体的な考慮事項によって異なります。 文字列インデックスを作成する他の方法 実際には、プレフィックス切り捨てを使用してすべての文字列をインデックスできるわけではありません。たとえば、ID番号やIPアドレスなどの文字列にプレフィックスインデックスを使用することは合理的ではありません。ID番号の最初の数桁は、同じ地域の人であれば一般的に同じであるため、プレフィックスインデックスを使用することは合理的ではありません。実際には、通常、IP値を数値に変換して保存します。 ID カード番号の場合、逆ストレージを使用したり、プレフィックスを取得してインデックスを作成したり、crc32() 関数を使用してハッシュ チェック コード (int 値) をインデックスとして取得したりできます。 逆: crc32: これら 2 つの方法は比較的効率的です。どちらも範囲検索はサポートしていませんが、等しい値の検索はサポートしています。 リバース方式ではリバース関数を使用する必要がありますが、返されるテーブルの数はハッシュ方式よりも多くなる場合があります。 ハッシュ モードでは、新しいインデックス フィールドを作成し、crc32() 関数を呼び出す必要があります。 (注: crc32() 関数によって取得された結果は一意であることが保証されません。重複する可能性がありますが、その可能性は低いです)。テーブルが返される回数は少なく、ほぼ 1 回で十分です。 やっと 一般に、文字列インデックスを作成するにはいくつかの方法があります。 1. 文字列が短いため、フィールド全体が直接インデックス化されます 2. 文字列が長く、プレフィックスの識別性が高いため、プレフィックスインデックスを作成します。 3. 文字列が長く、プレフィックスが区別できない場合は、逆順またはハッシュモードでインデックスを作成します(この方法は範囲クエリでは機能しません) 4. 実際の状況に応じて、ip などの特殊な文字列は特別に扱われます。 要約する 以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。 以下もご興味があるかもしれません:
|
<<: Vue3を使用してjsで呼び出せるコンポーネントを実装する
>>: Linux ファイル管理コマンド例の分析 [権限、作成、削除、コピー、移動、検索など]
目次1. シーンの読み込み2. ノードを見つける1. ノード検索2. その他のノード操作3. 再生ア...
昨日は遅くまで寝ていて、一日中起きていました。私の年齢では、夜更かしして本を書くのはもう無理のようで...
目次インデックスタイプインデックス構造非クラスター化インデックスクエリインデックスカバー要約するイン...
0. 環境この記事のオペレーティング システム: CentOS 7.2.1511 x86_64 My...
インストール前の作業: VMware Workstation がインストールされていることを確認し、...
CUDA とは何かを紹介するのではなく、複数の CUDA バージョンの共存とリアルタイム切り替えをど...
目次ログはどこに保存されますか?コンテナ内のアプリケーションからのログを表示するDockerデーモン...
前回の記事「Docker コンテナの UID と GID を理解する」では、Docker コンテナ内...
この記事の例では、コンピュータカメラを呼び出して写真機能を実現するためのvueの具体的なコードを参考...
vue-cli は stimulsoft.reports.js を使用します (ナニーレベルのチュー...
序文ビューは、データベース システム内で非常に便利なデータベース オブジェクトです。 MySQL 5...
1. 現在のスクリプトの実際のパスを取得します。 #!/bin/bash if [[ $0 =~ ^...
目次複雑なクエリとステップバイステップのクエリクエリステートメントを分割する共同クエリの分解問題のあ...
プロジェクト内のページの長さはおよそ2000px以上あり、背景画像にはテクスチャやグラデーションがあ...
MySQL が挿入などの操作を実行するときにコミットする必要があるかどうかは、ストレージ エンジン...