MySQL之索引分类

it2024-10-06  38

索引类型

MySQL有多种索引类型,使⽤不同的⻆度,分类也有所不同。

功能逻辑角度

普通索引

普通索引是基础的索引,没有任何约束,主要⽤于提⾼查询效率。示例:

CREATE INDEX index_name ON table(column(length))

唯一索引

唯⼀索引就是在普通索引的基础上增加了数据唯⼀性的约束,索引列的值必须唯⼀,允许有NULL值。如果⼀个唯⼀索引同时还是个组合索引,那么表示列值的组合必须唯⼀。在⼀张数据表⾥可以有多个唯⼀索引。示例:

CREATE UNIQUE INDEX index_name ON table(column(length))

主键索引

主键索引是⼀种特殊的唯⼀索引,不允许有NULL值,并且⼀张表最多只有⼀个主键索引。

组合索引

指多个字段上创建的索引,使⽤组合索引时遵循最左前缀原则。示例:

CREATE INDEX index_name ON table (column1,column2)

最左前缀原则,指的是索引按照最左优先的方式匹配索引。如创建了一个组合索引(column1, column2, column3),那么,如果查询条件是: WHERE column1 = 1、WHERE column1= 1 AND column2 = 2、WHERE column1= 1 AND column2 = 2 AND column3 = 3 都可以使用该索引;

WHERE column1 = 2、WHERE column1 = 1 AND column3 = 3就无法匹配

全文索引

全⽂索引,⽤来检索⽂本中的关键字,⽤得很少,⼀般应对这种需求⽤Elasticsearch或者Solr之类的全文搜索引擎

CREATE FULLTEXT INDEX ……

物理存储角度(聚簇索引、非聚簇索引)

聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点不存储数据,而是指向对应数据块的指针。

InnoDB的主键索引使用的是聚簇索引,而MyISAM使用了非聚簇索引。

表数据和主键一起存储的,聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。而由于无法同时把数据行同时存放在两个不同的地方,所以一张表只有一个聚簇索引。 聚簇索引的二级索引:叶子节点不会保存引用的行的物理位置,而是保存行的主键值。 非聚簇索引:叶子节点存储的是数据块的指针。表数据和索引分开存储。查询时,先找到索引,再根据索引找到对应的数据行

聚簇索引 vs 非聚簇索引

聚簇索引优点:

查找效率理论上比非聚簇索引要高,但是插入、修改、删除操作的性能比非聚簇索引要低范围查询方便

聚簇索引缺点:

插入速度严重依赖于插入顺序,因此,对于InnoDB表,我们一般都会定义一个自增增的ID列为主键 更新主键的代价很高,因为将会导致被更新的行移动。(当然一般不会更新主键)聚簇索引增删改操作性能比非聚簇索引性能低

对于InnoDB:

主键使用聚簇索引,并且一张表有且只有1个聚簇索引。如果创建的表没有主键,则InnoDB会隐式定义一个主键来作为聚簇索引。二级索引(非主键索引)叶子节点存储的是行的主键值,因此使用二级索引命中数据需要查询两次,先用二级索引搜索到主键,再用主键查找数据。

参考内容

说一下聚簇索引 & 非聚簇索引
最新回复(0)