一分钟明白MySQL聚簇索引和非聚簇索引

一分钟明白MySQL聚簇索引和非聚簇索引html

MySQL的InnoDB索引数据结构是B+树,主键索引叶子节点的值存储的就是MySQL的数据行,普通索引的叶子节点的值存储的是主键值,这是了解聚簇索引和非聚簇索引的前提数据库

什么是聚簇索引?
很简单记住一句话:找到了索引就找到了须要的数据,那么这个索引就是聚簇索引,因此主键就是聚簇索引,修改聚簇索引其实就是修改主键。
数据结构

什么是非聚簇索引?
索引的存储和数据的存储是分离的,也就是说找到了索引但没找到数据,须要根据索引上的值(主键)再次回表查询,非聚簇索引也叫作辅助索引。
url

clustered index(MySQL官方对聚簇索引的解释)
The InnoDB term for a primary key index. InnoDB table storage is organized based on the values of the primary key columns, to speed up queries and sorts involving the primary key columns. For best performance, choose the primary key columns carefully based on the most performance-critical queries. Because modifying the columns of the clustered index is an expensive operation, choose primary columns that are rarely or never updated.
注意标黑的那段话,聚簇索引就是主键的一种术语

.net

一个例子
下面咱们建立了一个学生表,作三种查询,来讲明什么状况下是聚簇索引,什么状况下不是。
code

create table student (orm

id bigint,
no varchar(20) ,
name varchar(20) ,
address varchar(20) ,
PRIMARY KEY (`branch_id`) USING BTREE,
UNIQUE KEY `idx_no` (`no`) USING BTREE

)ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
第一种,直接根据主键查询获去全部字段数据,此时主键时聚簇索引,由于主键对应的索引叶子节点存储了id=1的全部字段的值。
htm

select * from student where id = 1
第二种,根据编号查询编号和名称,编号自己是一个惟一索引,但查询的列包含了学生编号和学生名称,当命中编号索引时,该索引的节点的数据存储的是主键ID,须要根据主键ID从新查询一次,因此这种查询下no不是聚簇索引
blog

select no,name from student where no = 'test'
第三种,咱们根据编号查询编号(有人会问知道编号了还要查询?要,你可能须要验证该编号在数据库中是否存在),这种查询命中编号索引时,直接返回编号,由于所须要的数据就是该索引,不须要回表查询,这种场景下no是聚簇索引
索引

select no from student where no = 'test'
总结
主键必定是聚簇索引,MySQL的InnoDB中必定有主键,即使研发人员不手动设置,则会使用unique索引,没有unique索引,则会使用数据库内部的一个行的id来看成主键索引,其它普通索引须要区分SQL场景,当SQL查询的列就是索引自己时,咱们称这种场景下该普通索引也能够叫作聚簇索引,MyisAM引擎没有聚簇索引。

原文地址https://www.cnblogs.com/sy270321/p/12864357.html

相关文章
相关标签/搜索