クラスタ化インデックスと非クラスタ化インデックスデータベース

また、クラスタ化インデックスと呼ばれるギャザー(クラスタ化)インデックス、

定義:論理的な順序の(典型的には、主キー列である)データの物理的な行と列の値の同じシーケンス、テーブルは、唯一のクラスタ化インデックスを持つことができます。
ここに画像を挿入説明

注:最初の列は、データのアドレス線ことを示しているディスクの物理アドレス 3に続いては、IDを主キー、クラスタ化インデックスの確立である内側の列とのSQLテーブルです。

私たちはと比較すると、その後、ディスク上のデータの物理アドレスラインのアドレスは比較的になる列値の同じ順序で行の物理的な順序、データのクエリID:上記の表と合わせて、この文の権利を理解することができますリスト上。そして、クラスタ化インデックスの物理的な配置の同じ順序ので、それは、クラスタ化インデックスを構築することができます。
ここに画像を挿入説明

チャートから、我々は、クラスタ化インデックスの利点を見ることができ、索引リーフ・ノードは、対応するデータノードであることができます、(MySQLのMyISAMの例外、このストレージエンジンは、より公正なユニーク制約、他の無差よりもインデックスと非クラスタ化インデックスをクラスタ化されました)インデックスは必要性の対応する列カバーしていないとき、インデックスに集まるのではなく、すべての列に対応するデータに直接アクセスする二次照会は、後で詳しく話します。だから、クエリの観点から、スピードのクラスタ化インデックスがより支配的になりがち

クラスタ化インデックスを作成します。

あなたは、インデックスを作成しない場合、システムが自動的に非表示列としてテーブルにクラスタ化インデックスを作成します。

1.主キーを指定したときにテーブルを作成します(注:SQL Severのインデックスをクラスタ化されたデフォルトの主キーで、あなたはまた、非クラスタ化インデックスを指定して、MySQLのクラスタ化インデックスの主キーであることができます)

create table t1(
    id int primary key,
    name nvarchar(255)
 
)

クラスタ化インデックスは、テーブルの後に追加されるの作成2

MySQLの

alter table table_name add primary key(colum_name)

全てのデータ線上順位のインデックス列によれば、上記の順序でインデックス移動する場合、再作成したがって、クラスタ化インデックスの物理的な順序の特殊な性質のため、テーブルを作成する際に、特に、クラスタ化インデックスが最もよく添加されますそれは非常に時間がかかり、パフォーマンスになります。


非凝集(クラスタ化されていない)インデックス

定義:インデックスindexと物理ディスクの記憶順序異なるアップリンク、テーブルの論理的な順序は、複数の非クラスタ化インデックスを持つことができます。

其实按照定义,除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引。如果非要把非聚集索引类比成现实生活中的东西,那么非聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不一定一致。
ここに画像を挿入説明

非聚集索引的二次查询问题

非聚集索引叶节点仍然是索引节点,只是有一个指针指向对应的数据块,此如果使用非聚集索引查询,而查询列中包含了其他该索引没有覆盖的列,那么他还要进行第二次的查询,查询节点上对应的数据行的数据。

有表t1:
ここに画像を挿入説明
其中有 聚集索引clustered index(id), 非聚集索引index(username)。

使用以下语句进行查询,不需要进行二次查询,直接就可以从非聚集索引的节点里面就可以获取到查询列的数据。

select id, username from t1 where username = '小明'
 
select username from t1 where username = '小明'

但是使用以下语句进行查询,就需要二次的查询去获取原数据行的score:

select username, score from t1 where username = '小明'

总结

聚集索引和非聚集索引的根本区别是表中记录的物理顺序和索引的排列顺序是否一致,本质是叶子节点的索引文件和数据文件是否分离的

建议使用聚集索引的场合为:

  • 某列包含了小数目的不同值。

  • 排序和范围查找。 非聚集索引的记录的物理顺序和索引的顺序不一致。

建议使用非聚集索引的场合为:

  • 此列包含了大数目的不同值;

  • 频繁更新的列

其他方面的区别:
1.聚集索引和非聚集索引都采用了 B+树的结构,但非聚集索引的叶子层并 不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中 的指针的方式。聚集索引的叶节点就是数据节点,而非聚集索引的叶节点仍然 是索引节点。

2.非聚集索引添加记录时,不会引起数据顺序的重组。

基于主键索引和普通索引的查询有什么区别?

mysql> create table T( 
	id int primary key,
	k int not null,
	name varchar(16),
	index (k)) engine=InnoDB;

(ID,k) 值分别为 (100,1)、(200,2)、(300,3)、(500,5) 和 (600,6)

主キーインデックスのリーフノードは、データの行全体を格納されています。InnoDB内で、主キーインデックスはまた、クラスタ化インデックス(クラスタ化インデックス)と呼ばれています。

非主キー索引のリーフ・ノードのコンテンツは、主キーの値です。InnoDB内で、非プライマリ・キー・インデックスは、二次インデックス(セカンダリインデックス)と呼ばれています

文はID = 500 T *から選択された場合 、 すなわち、主キーのクエリ、木はB +ツリーのIDを検索する必要があります

文は、K = 5 T *から選択された場合 、 つまり、一般的なインデックスクエリ、あなたは一度IDの検索インデックスツリーに、500 IDの値を取得し、インデックスkツリーを検索する必要があります。このプロセスは、テーブルに戻って呼ばれています

秩序維持するためにはB +ツリーインデックス、必要な保守を行うために必要な時間に新しい値を挿入します。上記の例では、新しい行のID値700を挿入した場合、ばかりレコードR5背後に新しいレコードを挿入する必要があります。新たに挿入されたIDが400である場合、それは、論理的に空の位置を、データをバックに移動する必要性は、比較的面倒です。

参考記事:
https://blog.csdn.net/qq_29373285/article/details/85254407
https://blog.csdn.net/qq_43193797/article/details/88593304
http://blog.itpub.net/30126024/viewspace -2221485 /

公開された107元の記事 ウォン称賛14 ビュー40000 +

おすすめ

転載: blog.csdn.net/belongtocode/article/details/103378750