在MySQL数据库中,索引是一种帮助快速访问表中数据的数据结构,索引的主要目的是提高数据库查询的效率,减少查询时间,根据不同的分类标准,MySQL中的索引可以分为多种类型。
按是否包含记录数据分类
1、聚簇索引(Clustered Index):将数据存储与索引放到了一块,找到索引也就找到了数据,不需要根据主键或行号去进行回表查询。
2、非聚簇索引:非聚簇索引的叶子节点上的data域存放的不是数据本身,而是数据存放的地址,主索引和辅助索引没什么区别,只是主索引中的key一定得是唯一的。
按索引是否建立在主键上分类
1、主键索引(PRIMARY KEY):在MySQL的主键上创建的索引就是主键索引,主键索引会自动创建,一个表只能有一个主键索引,同时主键索引也是唯一索引。
2、辅助索引(Secondary Indexes):在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。
按索引的底层数据结构分类
1、HASH索引:HASH索引的特性是等值查询较快,但是不稳定,不能使用范围查询,不能避免数据排序,不能利用组合索引的部分字段进行查询,不支持模糊查询,避免不了回表查询。
2、B+Tree索引:B+Tree索引的所有关键字都出现在叶子结点的链表中,且链表中的关键字恰好是有序的;内节点不存储data,只存储key;叶子节点不存储指针。
3、T-TREE索引:BTREE索引由NDB存储引擎实现为T树索引,算是BTREE索引在NDB存储引擎中的升级实现。
4、R-Tree索引:从MySQL 8.0.12开始,R-Tree索引开始在SPATIAL索引中使用,MySQL对空间列上的SPATIAL索引使用R-Trees进行二次分割。
5、自适应hash索引(Adaptive Hash Index):InnoDB存储引擎中的内存结构的组成部分,InnoDB存储引擎会监控对表上各索引页的查询,如果观察到建立hash索引可以提高查询速度,则自动建立hash索引。
6、覆盖索引:如果一个索引包含所有需要查询的字段的值,称为覆盖索引,即只需扫描索引而无须回表。
7、降序索引(Descending Indexes):从MySQL 8.0开始支持降序索引,不再忽略索引定义中的DESC。
按索引的常规功能分类
1、唯一索引(UNIQUE Indexs):要求索引列的所有值都只能出现一次,即必须唯一。
2、普通索引(Normal index):仅用来提高查询速度,没有其他特性。
3、全文索引(FULLTEXT Indexes):MySQL可以通过建立全文索引,利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度。
4、空间索引(Spatial indexes):空间索引使用R树,R树是用于索引多维数据的专用数据结构。
按索引是否包含多个字段分类
1、多字段索引(Multiple-Column Indexes):也叫组合索引,即索引中包含多个表字段。
其他特性索引
1、倒序索引(Descending Indexes):从MySQL 8.0开始支持降序索引,不再忽略索引定义中的DESC。
2、不可见索引(Invisible Indexes):从MySQL 8.0.12开始,InnoDB存储引擎开始支持不可见索引。
3、覆盖索引:如果一个索引包含所有需要查询的字段的值,称为覆盖索引,即只需扫描索引而无须回表。
示例说明
假设有一个用户表tb_user
,其结构如下:
CREATE TABLE tb_user ( id INT PRIMARY KEY, name VARCHAR(50), phone VARCHAR(11) NOT NULL, email VARCHAR(100), profession VARCHAR(11), age TINYINT UNSIGNED, gender CHAR(1), status CHAR(1), createtime DATETIME );
在这个表中,我们可以创建以下几种类型的索引:
1、主键索引:id
字段已经作为主键自动创建了主键索引。
2、唯一索引:可以为phone
字段创建一个唯一索引,因为电话号码应该是唯一的。
3、普通索引:可以为name
字段创建一个普通索引,以加快按名字搜索用户的速度。
4、复合索引:可以为profession
,age
,status
创建一个复合索引,以加快基于这些字段的组合查询。
5、全文索引:如果需要对email
字段进行全文搜索,可以为其创建全文索引。
6、空间索引:如果createtime
字段存储的是地理位置信息,可以为其创建空间索引。
FAQs问答
Q1: 什么是聚簇索引和非聚簇索引?
A1: 聚簇索引将数据存储与索引放到了一块,找到索引也就找到了数据,非聚簇索引的叶子节点上的data域存放的不是数据本身,而是数据存放的地址。
Q2: 为什么选择B+Tree作为MySQL的主要索引结构?
A2: B+Tree对比其他索引结构更好的支持范围查询,因为B+Tree数据结构非叶子节点不储存数据,在叶子节点储存数据,并且是递增,通过双向链表连接,提高的区间的访问效率。
小编有话说:
在设计数据库索引时,选择合适的索引类型对于提高查询性能至关重要,了解不同类型索引的特点和适用场景,可以帮助我们做出更明智的决策,不是所有的索引都是越多越好,过多的索引可能会影响数据库的更新操作性能,建议只为那些常用的搜索字段建立索引。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1455048.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复