達成Mysql8の新機能の基礎となる降順インデックス

インデックスをどのように下降しています

ながら、これは、インデックスに精通してもよいインデックスは降順のインデックスのサブセットがインデックスを降順実際には、なじみのないれます。

我々は通常、インデックスを作成するために、次の文を使用します。

create index idx_t1_bcd on t1(b,c,d);
复制代码

平均SQL、上記テーブルT1に、B、Cのために、D、3つのフィールドは、関節インデックスを作成します。

しかし、我々は、これはと等価であるSQL SQL上方および下方に実際にあるかわかりません。

create index idx_t1_bcd on t1(b asc,c asc,d asc);
复制代码

ascこれは、アウトと呼ばれる指標を作成するために、この構文を使用し、昇順を表し、インデックスを昇順にそれは我々が通常のインデックスを作成するときに、インデックスが昇順の作成です。

あなたは、インデックスが作成された時点で、あなたはフィールドにASCを設定することができ、それがDESCではないも、それを設定することができると思うかもしれませんか?

もちろん、私たちは、例えば、3つのステートメントを以下のことができます。

create index idx_t1_bcd on t1(b desc,c desc,d desc);
create index idx_t1_bcd on t1(b asc,c desc,d desc);
create index idx_t1_bcd on t1(b asc,c asc,d desc);
复制代码

この構文はまたの外に呼ばれるインデックスを作成するために、この構文を使用し、MySQLではサポートされている降順索引を、重要な問題は次のとおりです。Mysql8.0前にサポートのちょうど文法的レベル、底が実際にサポートしていません。

我々は、説明するの一例として、ここではMysql7、Mysql8 2つのバージョンを使用しました:

Mysql7では、Mysql8は、それぞれ、テーブルを作成し、B、C、D、Eの5つのフィールドがあります。

create table t1 (
a int primary key,
b int,
c int,
d int,
e varchar(20)
) engine=InnoDB;
复制代码

そして、降順で別のインデックスを作成します。

create index idx_t1_bcd on t1(b desc,c desc,d desc);
复制代码

一度作成された、我々は、インデックス情報で次のSQLを見て使用します。

show index from t1;
复制代码

Mysql7では、結果を取得します。

image.png

Mysql8では、結果を取得します。

image.png

私たちは、あなただけは見つけることができるはず慎重に3行、のidx_t1_bcdするKEY_NAME気に、二つの結果での結果の照合フィールドが同じではありません。

  • Mysql7において、照合結果フィールドは、A、Aは、B、Cを表し、Dソートフィールドは、三のASCであります
  • D、D、D、Bを表し、C Mysql8において、結果照合フィールドは、DはソートDESC三つのフィールドであります

私たちは、インデックスを作成するときには、明らかに、構文レベルでBが指定されている、C、D発注三つのフィールドを見ることができるDESC、あるインデックスを降順でMysql7におけるサポートの唯一の文法的なレベルを、根底には本当にサポートしていません。 、および固定昇順インデックスです。降順のインデックスから実際の根本的な支援でMysql8で。

これまでのところ、我々は昇順と降順のインデックスインデックスの一般的な理解を持っている必要がありますが、私たちは昇順を知らないと、最後にインデックスの基礎となる降順インデックスが達成する方法であるため、実際には、理解していませんでした。

昇順インデックス基本となる実装

私たちは、インデックスは、検索を高速化するために使用されていることを知っているが、なぜインデックスは、クエリの速度を向上させることができますか?

あなたがしたい場合は、今、列または列の数の障害であり、このような[1,3,7,9,2,5,4,6,8]などの列の数、与えられたこのクエリの速度の列数を増やし、あなたが最初の意志を何をしますか?私はほとんどの人がすると考えることができると信じて並べ替えるなどを取るにつれて、ソートの昇順で、その混沌としたシリーズを入れて、[8、9]、列の番号の後に、この順で、我々はこの二分法を改善するために、そのようなアルゴリズムを使用することができ、そしてそのクエリの速度の列数。

:私はあなたがこれでお伝えしたいと思います。この例を与えるあなたはデータを並べ替えることができ、すべての最初の、クエリの速度データの収集を改善したいです。

我々は、クエリの速度テーブルを改善したいのであれば、テーブルに格納されているMySQLのデータは、我々が最初にこのデータテーブルのしていることができ、同じでソートし、表データの行は、私たちが今している、多くの分野を含んでいますこれらのデータの行をソートしたい、我々はこの順序フィールド、それに基づいて決定されるべき?それがありますインデックスあなたが指定した列のインデックスは、テーブルのデータ行をソートするために使用されて作成するときに、。

例えば、我々はまだ、上記で作成したT1テーブルを使用する8つのT1テーブルにデータを挿入します。

insert into t1 values(4,3,1,1,'d');
insert into t1 values(1,1,1,1,'a');
insert into t1 values(8,8,8,8,'h');
insert into t1 values(2,2,2,2,'b');
insert into t1 values(5,2,3,5,'e');
insert into t1 values(3,3,2,2,'c');
insert into t1 values(7,4,5,5,'g');
insert into t1 values(6,6,4,4,'f');
复制代码

その後、データはファイルに保存されなければならないので、データファイルのフォーマットは、挿入の順序と一致し、何かのように、保存されました:

4311d
1111a
8888h
2222b
5235e
3322c
7455g
6644f
复制代码

メモ、t1はInnoDBストレージエンジンであり、フィールドが主キーであり、これらの処理データが挿入されたときにInnoDBストレージエンジンので、それは私が上記前記データの形式で主キーによってソートされ、保存されたファイルが正確ではありませんあまりにも膨大たくないので、下に取得しない、興味のある学生は公共の数の波に焦点を当てることができるので、:1時25分、私は特に最後にB +ツリーなどの、インデックス内の特定の実装のInnoDBを説明する記事を書きます生成する方法でありますA。

以上を踏まえ、我々は、このような3つのレコードはあなたが6回を探している、見て開始する最初の行からレコードを検索する必要がありますが、我々は上記のデータaに従った場合=行を見つけるなどのデータを、見つけるために、この方法を保存する場合ソートするフィールドのサイズ:

1111a
2222b
3322c
4311d
5235e
6644f
7455g
8888h
复制代码

我々は、この行は= 3を記録した後見つけた場合、ソートされた、我々はわずか3回をチェックする必要があります。そして、私たちは前に保存ランク外基づき、我々はすべての8行が= 3.5ラインデータが存在し、場合しない確定照会する必要がある場合、我々は今、= 3.5ラインデータを検索する必要がある場合は、という利点がありますあなたが見つけたときので、私たちはソートされた後にストレージを使用して、我々は唯一、ちゃんと4回をチェックする必要がある4311dレコードがありませんこれらの行は、あなたが4> 3.5を見つけるだろうし、すでに= 3.5ラインを決定することができるときそれは存在しています。

私たちは、T1にインデックスを作成する場合は、上記のようなインデックスを作成し、私たちが書く場合、次のSQLです。

create index idx_t1_bcd on t1(b,c,d);
复制代码

T1は指数を表すためにSQLを作成するために、インデックスフィールドは、B、C、Dであり、ソート、B、Cに応じて、三つのフィールド、並べ替え後の類似の元のデータのことをdは上昇されます。

1111a
2222b
5235e
4311d
3322c
7455g
6644f
8888h
复制代码

よく見て持つことができる、など、データライン仕分けラインへの三つのフィールド上の上記のB、C、Dに基づいて記録されている1111aB、C、Dの値三つのフィールドで111あり、2222bB、C、D 3フィールド値は222111より少ない222、上面の対応する行。

そう、データが並べ替えた場合、それは良い何ですか?利点にちょうど似たソートフィールドの後によると、実際には、あなたが今見つけたいなどのb=4 and c=4 and d=4データも実際には、これはインデックスの原則である、速く問い合わせることができます:我々は、テーブルの上にインデックスを作成し、このテーブルがありますデータがソートされ、ソートされたデータは、後の検索を高速化する機能です。

注意すべき別の点は、ソートモードにおける多くがあることである、またはデータ構造は、バイナリツリー、赤黒木、B +ツリーデータ構造、実際にデータをソートされ、異なる順序の唯一の形態として、利用することができますのみ、各データ構造のための独自の特性を持っていますが、我々はすべて知っている必要があり、MySQLは最も頻繁に使用されるB +ツリーです、または、理由スペースの長過ぎることにしたくない、のように、興味のある学生は、公共の数の波に焦点を当てることができます:1 25点は、私​​は、具体的にどのように生成することで最終的にB +ツリーを含むインデックス内の特定の実装INNODBを説明するために記事を書くであろう。

、また便利でも注文だけでなく、クエリの速度を向上させることができ、私は、我々は、インデックスの再理解している必要があり、ここを参照してください信じて、私たちは上に引用いくつかの例は、昇順であり、かつ優れた配列データの後に行私たちが今したい場合例えば、行わT1にorder by b asc,c asc,d asc;すでにT1テーブルに設立された場合、この種のためにb,c,d的升序索引直接使用することができる書類の順になるよう、そして代表的なデータT1テーブルはB、C、に応じて予め、ソートdのデータの行がソートされた、ソート再びfilesortレコードを使用しないでください。

そして、私たちは順番にであるならばorder by b desc, c desc, d desc、同じことが、昇順インデックスB、C、Dを利用することができるので、BのASC、CのASCによるご注文いただいた場合のD ASC のb DESCによってトラバーサルからダウンそれに、もしオーダー、C DESCは、DのDESCはそれが下から上に横断することができます。

だから、それは順序がBのASC、DESC C、である場合のD DESC それ?順序が使用する方法ではないではありませんb,c,d的升序索引アップ。

今度は、必要なインデックスを降順アップ。

インデックス基礎となる実装を降順

私たちは、原則昇順インデックスの実現に大きな長さを費やし、結論はということです昇順でテーブル内のデータが指定したフィールドのサイズ比較によります

はい何昇順?データのサイズを比較した後で大下で小さな、またはそれはB +ツリーがある場合である左側に、右大小さいですそして、それは下降している次に大小の上、またはそれはB +木であるならば、それはあり、左に小さな右素晴らしいです

したがって、生データの上記シェア。

4311d
1111a
8888h
2222b
5235e
3322c
7455g
6644f
复制代码

我々が続く場合は、このデータa descソートは、次のとおりです。

8888h
7455g
6644f
5235e
4311d
3322c
2222b
1111a
复制代码

それは我々が続く場合は、このデータという、非常にシンプルでb desc, c desc, d descソートは次のとおりです。

8888h
6644f
7455g
3322c
4311d
5235e
2222b
1111a
复制代码

あれば、我々はに従ってこのデータが欲しいということ、また、非常にシンプルであるb desc, c asc, d descことの並べ替え?これは少し混乱しないのですか?

それは、難しいことではありません実際には、データのサイズ比較の並べ替え、我々は外観をシミュレートするために、データの次の3行を使用します。

3322c
7455g
4311d
复制代码

まず、BのDESCに従い、C DESC、Dの降順の並べ替え、次のような結果が得られました:

7455g
3322c
4311d
复制代码

bはDESC、CのASC、Dの降順のソートによると、以下の結果が得られました:

7455g
4311d
3322c
复制代码

兄の部分を理解することができる必要がある可能性があり、実際には、b desc意味が大きなデータフィールドにBで表され、以下のデータが小さい、等しい比較が開始された後、データ・フィールドCおよびCは、列を昇順に、すなわち、Cフィールドのフィールドであります小さな人、次のデータ、大規模のデータ。だから我々は、上記の結果を得ることができます。

これは、降順のインデックス

概要

実際、インデックスインデックスはちょうど別の種類であるインデックスを作成するときに、インデックスを降順後に達成されているMysql8は、我々はより柔軟で昇順と降順、あなたは照合ビジネスニーズに基づいて適切なインデックスを作成するので、あなたのクエリを行うことができます速いです。

もちろん、原則については、この論文の話は、私たちは、私は非常に単純な方法の種類の例を与えていない上に、B +木の使用での並べ替えMySQLを知っている必要がありますが、B +ツリーの原理は同じであってもで、データのみのサイズを比較します。

もう一つのポイントは、今だけInnoDBストレージエンジンはインデックスを降順サポートしています

あなたが見つけた場合は、この記事では、知識を獲得することができます前方に助けることができ、知識を共有することになります。あなたが最初の時間は、よりエキサイティングなコンテンツを学びたいのであれば、マイクロチャネル公衆番号に注意してください:1時25分

おすすめ

転載: juejin.im/post/5d11d923e51d45777b1a3dc4