mysql索引之二级索引学习总结

二级索引又称辅助索引、非聚集索引(no-clustered index)。b+tree树结构。然而二级索引的叶子节点不保存记录中的所有列,其叶子节点保存的是<健值,(记录)地址>。好似聚集索引中非叶子节点保存的信息,不同的是二级索引保存的是记录地址,而聚集索引保存的是下一层节点地址。记录的地址一般可以保存两种形式。
1. 记录的物理地址,页号:槽号:偏移量
2 . 记录的主键值

innodb引擎是索引组织表,所有记录都放在聚集索引里,因此其辅助索引中的记录地址存放的主键的键值。

innodb读操作:

通过二级索引查询记录仅能得到主键值,要查询完整的记录还需要再通过一次聚集索引查询,这种查询方式为书签查找(bookmark lookup)。
注:聚集索引:例如查字典,每个字所在的位置有一个页码,如果你知道一个字的所在具体页数便可直接翻到相应的页,此刻可以把字典中的页码看成主键。字典的正文就是一个查询目录而不需要在通过其他目录来查找。这种正文本身具有一定的规则排序的目录称为聚集索引。
二级索引:此操作就如查字典,先找到生字的偏旁部首查找到字在哪一页(获得主键的位置),然后再翻到生字的具体章节叶。

innodb写操作:

仅当主键发生改变时,才会更新二级索引

二级索引的非叶子节点存放的记录格式为<键值,主键值,地址>,二级索引的非叶子节点依然存在主键信息。二级索引节点的记录不保存隐藏列xid和roll ptr。聚集索引的非叶子节点保存的是下一层节点地址。
由于二级索引不包含记录的完整信息,在innodb存储引擎中二级索引的树高度比聚簇索引的树高度小,二级索引效率低。

知识关联:聚簇索引和辅助索引的区别
交流群:725450393
在这里插入图片描述

### MySQL 索引二级索引的概念、区别及使用场景 #### 一、索引的基本概念 在MySQL中,索引是一种数据结构,用于加速数据的检索操作。通过创建索引,可以显著提高查询性能[^1]。索引的作用类似于书籍的目录,能够快速定位到所需的数据行。 #### 二、二级索引的定义 二级索引(Secondary Index)是相对于主键索引(Primary Key Index)而言的。主键索引通常是一个聚集索引(Clustered Index),而二级索引则是非聚集索引(Non-Clustered Index)。二级索引存储的是索引字段和对应的主键值。当通过二级索引查找数据时,首先会在二级索引树中找到主键值,然后利用主键值回表到主键索引树中获取完整的记录[^2]。 #### 三、索引二级索引的区别 1. **存储结构**: - 主键索引(聚集索引)直接存储了数据行的完整信息。 - 二级索引存储索引字段和主键值,需要通过主键值回表获取其他字段的数据[^2]。 2. **查询效率**: - 使用主键索引查询时,可以直接从索引中获取数据,无需额外的回表操作。 - 使用二级索引查询时,通常需要两次查询:一次查询二级索引树,另一次回表查询主键索引树。 3. **适用场景**: - 主键索引适用于唯一标识每一行数据的场景。 - 二级索引适用于频繁查询但不是唯一标识的字段,例如用户的姓名、年龄等[^1]。 #### 四、二级索引的使用方法 创建二级索引的语法如下: ```sql CREATE INDEX index_name ON table_name (column_name); ``` 例如,在`student`表的`name`字段上创建一个二级索引: ```sql CREATE INDEX idx_name ON student (name); ``` 为了提高查询性能,可以创建覆盖索引(Covering Index),即索引包含查询所需的所有字段,避免回表操作。例如,如果查询条件为`name='张三' and age=15`,并且需要返回`address`字段,可以通过以下方式创建覆盖索引: ```sql CREATE INDEX covering_index ON student (name, age, address); ``` #### 五、使用场景分析 1. **数据量较大的表**: - 对于数据量较大的表,建议创建索引来加速查询操作[^1]。 2. **重复数据较多的列**: - 如果某一列的重复数据较多,则不建议为其创建索引,因为索引的效果会大打折扣。 3. **经常更新的表**: - 对于频繁更新的表,应避免创建过多的索引,以免影响写入性能。 4. **无序值作为索引**: - 不建议使用无序值(如MD5、UUID)作为索引,因为这些值会导致索引树的高度增加,降低查询效率[^1]。 5. **复合索引**: - 在多条件查询中,可以创建复合索引以提高查询效率。例如,对于查询`name='张三' and age=15`,可以创建`(name, age)`的复合索引[^3]。 6. **覆盖索引**: - 如果查询条件和返回字段都可以被索引覆盖,则可以避免回表操作,从而提高查询效率[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值