当前位置: 首页 > 后端技术 > Java

主键索引是聚集索引吗?MySQL索引类型大回顾

时间:2023-04-01 13:46:42 Java

@[toc]之前松哥在上一篇介绍MySQL索引之前,有小伙伴表示被概念搞糊涂了,主键索引,非主键索引,聚簇索引,非-聚簇索引索引、二级索引、辅助索引等,今天我们就来了解一下这些概念。1.按功能划分。索引主要有四种:普通索引、唯一索引、主键索引、全文索引,普通索引是最基本的索引。查询效率。常见的索引创建方法如下:CREATETABLE`user`(`id`int(11)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(64)DEFAULTNULL,PRIMARYKEY(`id`),KEY`name`(`名称`))ENGINE=InnoDBAUTO_INCREMENT=4DEFAULTCHARSET=utf8mb4;name字段为普通索引(括号外为索引名,括号内为索引字段)。唯一索引在普通索引的基础上增加了数据的唯一性约束。一个表中可以同时存在多个唯一索引。唯一索引创建方法如下:CREATETABLE`user`(`id`int(11)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(64)DEFAULTNULL,PRIMARYKEY(`id`),UNIQUEKEY`name`(`name`))ENGINE=InnoDBAUTO_INCREMENT=4DEFAULTCHARSET=utf8mb4;name字段是唯一索引。主键索引在唯一索引的基础上增加了一个非空约束(即添加了唯一索引的字段可以包含NULL值),即NOTNULL+UNIQUE,最多只有A主键索引,当然一个主键索引可以包含多个字段。前面两个例子中已经有创建主键索引的方法,这里就不一一列举了。事实上,我们很少在MySQL中使用全文索引。如果项目中有全文索引的需求,一般可以通过Elasticsearch或者Solr来完成。目前比较流行的是Elasticsearch。宋哥之前还专门录了个视频,后台回复es获取教程链接。还需要注意MySQL全文索引支持的版本:在MySQL5.6之前,只有MyISAM存储引擎支持全文索引。MySQL5.6及以后版本,MyISAM和InnoDB存储引擎都支持全文索引。创建全文索引对字段类型也有要求。只有数据类型为CHAR、VARCHAR、TEXT的字段才能创建全文索引。MySQL的全文索引最初只支持英文,因为英文分词比较方便;中文分词比较麻烦,所以最早的MySQL全文索引是不支持中文的。从MySQL5.7.6开始,引入了ngram全文分析器来解决分词问题,这个tokenizer对MyISAM和InnoDB引擎都有效。但是,MySQL的全文索引并不好用。如果你有这个需求,你应该直接去Es。全文索引创建如下:CREATETABLE`user`(`id`int(11)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(64)DEFAULTNULL,PRIMARYKEY(`id`),FULLTEXTKEY`name`(`name`))ENGINE=InnoDBAUTO_INCREMENT=4DEFAULTCHARSET=utf8mb4;名称字段是全文索引。2.按物理实现来划分索引按物理实现可以分为两大类:聚集索引(也有人称之为“聚簇索引”)非聚集索引(也有人称之为“非聚集索引”)Index")2.1聚簇索引存储聚簇索引时,可以根据主键对数据进行排序存储(不是必须的,视情况而定)。B+Tree的叶子节点是完整的数据行。一个完整的行数据找到了,如下图,在聚簇索引中,叶子节点存放的是每一行的数据,在聚簇索引中,表中的数据行是按照索引的顺序存放的,非常有效用于查找行。只有当表包含聚集索引时,表中的数据行才会根据索引列的值进行物理排序并存储在磁盘上。每个表只能有一个聚簇索引,原因很简单,因为数据行本身只能按一种顺序存储。当我们基于InnoDB引擎创建表时,我们会创建一个聚簇索引,每张表都有一个唯一的聚簇索引:如果这张表定义了一个主键索引,那么这个主键索引将被用作聚簇索引。如果此表未定义主键索引,则使用表的第一个唯一非空索引作为聚簇索引。如果这张表没有唯一非空索引,那么InnoDB会在内部生成一个隐藏主键作为聚集索引。这个隐藏的主键是一个6字节的列,其值将随着数据的插入而自动递增。根据上面的描述,可以看出主键索引和聚集索引不是一回事,大家不要搞混了!聚簇索引的主要优点是查询速度快。如果要查询完整的数据行,使用非聚集索引往往需要返回表,而使用聚集索引可以一步完成。但是聚簇索引也有一些缺点:聚簇索引可以减少磁盘IO的次数,这在传统的机械硬盘中是很有优势的,但是如果是固态硬盘或者内存(有时为了提高操作效率,数据库服务器会有更大的内存),这个优势并不明显。插入聚簇索引时,最好有主键自增,这样插入自增主键时速度更快,并且可以直接插入,不涉及叶节点分裂(不需要移动其他记录);而其他非自增主键插入时,可能会插入到两个已有数据之间,可能会导致叶子节点分裂等问题,插入效率低(需要移动其他记录)。如果聚集索引在插入时不是自增主键,插入效率会比较低。2.2非聚集索引非聚集索引一般称为二级索引或辅助索引。对于非聚集索引,数据库会有单独的存储空间进行存储。非聚簇索引在查找的时候需要经过两步,比如执行select*fromuserwhereusername='javaboy'(假设username字段是非聚簇索引),那么就需要查找B+首先是username列索引的树,这个B+Tree的叶子节点不存储完整的数据行,而是主键值。当我们查找完成后得到主键的值,再用主键值查找主键索引的B+Tree,就可以得到一行完整的数据。所以如果我们在查询中使用非聚集索引,那么我们会搜索两棵B+Tree,第一次搜索B+Tree得到主键值然后搜索聚集的B+Tree指数。这个过程被回调到表中。一个表只能有一个聚簇索引,但可以有多个非聚簇索引。使用聚簇索引时,数据查询效率高,但如果对数据进行插入、删除、更新等操作,效率会低于非聚簇索引。3.小结一般来说,数据库索引可以按照两种思路分类:按功能分类和按存储方式分类。按功能可分为普通索引、唯一索引、主键索引、全文索引四种,按存储方式可分为聚簇索引和非聚簇索引两种。如果您有任何问题,请留言讨论。