一分钟理解MySQL聚簇索引和非聚簇索引

一分钟理解MySQL聚簇索引和非聚簇索引

MySQL的InnoDB索引数据结构是B+树,主键索引叶子节点的值存储的便是MySQL的数据行,一般索引的叶子节点的值存储的是主键值,这是了解聚簇索引和非聚簇索引的条件

什么是聚簇索引?
很简单记住一句话:找到了索引就找到了需求的数据,那么这个索引便是聚簇索引,所以主键便是聚簇索引,修正聚簇索引其实便是修正主键。

什么对错聚簇索引?
索引的存储和数据的存储是别离的,也便是说找到了索引但没找到数据,需求依据索引上的值(主键)再次回查询,非聚簇索引也叫做辅佐索引。

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.
留意标黑的那段话,聚簇索引便是主键的一种术语

一个比如
下面咱们创建了一个学生表,做三种查询,来阐明什么情况下是聚簇索引,什么情况下不是。

create table student (

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的一切字段的值。

select * from student where id = 1
第二种,依据编号查询编号和称号,编号自身是一个仅有索引,但查询的列包含了学生编号和学生称号,当射中编号索引时,该索引的节点的数据存储的是主键ID,需求依据主键ID从头查询一次,所以这种查询下no不是聚簇索引

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