MySQL复习

55 阅读6分钟

今日复习:

  • MySQL有哪些索引?

  • 索引的底层数据结构是什么?

  • B树和B+树有什么区别?

  • 什么字段适合作为主键?为什么?

  • 聚簇索引和非聚簇索引的区别?

  • 什么是回表?

  • 说一下什么是索引覆盖机制?

  • 创建一个索引后,mysql会做什么工作?

  • 说一下基于索引的查找数据过程?

  • 写入语句执行时,会对索引产生怎样的影响?

  • 说一下索引的最左匹配原则?

    1. 以数据结构区分可以分为:哈希索引,b+树索引,R-tree索引和T-tree索引 - 以字段数量区分可以分为单列索引,联合索引,前缀索引 - 以功能逻辑区分可以分为普通索引,唯一索引,主键索引,全文索引和空间索引 - 以存储方式区分可以分为:聚簇索引和非聚簇索引

    2. 这要根据具体的存储引擎来划分,通常分为为哈希和b+树两种结构,通常是B+树

    3. 关系型数据库经常执行一些范围查询操作,而普通的B树索引,各个叶子节点之间没有指针相连,所以对范围查询不太友好。而B+树则不同,每个叶子节点都会有一根指向下一节点的指针,范围查询可以基于这些指针快捷查找

    4. 数值类型,且具备顺序递增特性的字段作为主键。因为要避免树结构的变化,确保每次新增的值都会直接放到最后面插入,减少树的分裂次数。

    5. 聚簇索引是物理空间和逻辑空间上的连续,索引数据和表数据放在磁盘的同一个位置存储,而非聚簇索引则是单纯上逻辑上的连续,索引数据和表数据分开存储,通过地址指针的形式指向数据。

    6. 回表查询指的是需要经过两次完整的查询过程,才能读取到目标数据。

    7. 索引覆盖机制是mysql的一种优化手段,是为了减少回表的次数。此时通过name,sex,age建立一个联合查询,基于联合查询,查询name,age两个值,因为这两个字段在联合查询中已经包括,那么就会直接从索引键中返回数据。

    8. 如果是空表创建索引,会根据创建的索引类型,存储引擎和字段类型等信息,在本地的表文件,索引文件中,直接创建一个树结构即可。但是如果表中有数据就不一样了 - 首先会根据索引类型进行判断,对索引字段的数据进行相应的处理 - 唯一索引:判断索引字段的每个值是否重复,如果重复就返回错误信息 - 主键索引:判断主键字段的每个值是否重复,是否有空值,有则返回错误信息 - 全文索引:判断索引字段的数据类型是否是纯文本,对索引字段进行分词处理 - 前缀索引:对于索引字段进行截取工作,选用指定范围的值作为索引键 - 联合索引:对于组成联合索引的多个列进行值连接,组成多列索引键 根据索引的数据结构,对数据进行处理,如果是B+树就对索引字段的值及逆行排序,按照顺序组成B+树结构。如果是Hash就对索引字段的值进行hash计算,处理相应的hash冲突,方便后续查找 根据表的存储引擎,索引字段再进行相应的处理 Innodb主键索引:对.ibd文件中的表结构进行重构,将索引键和行数据调整到一块内存中进行存储。 Innodb次级索引:因为有聚簇索引,将非聚簇索引的索引值,与行数据对应的聚簇索引键的关联起来 MyISAM:由于表数据在单独的.MYD文件中,因此可以直接以磁盘指针的关联表数据。

    9. 索引查找数据的过程首先根据查询语句的条件字段,去内存中查找对应的索引的根节点。2.通过根节点中记录的叶节点地址,逐步去遍历查找索引树,最终定位到目标数据所在的叶子节点。但遍历索引树的过程,采用的是二分查找法,拿到一个叶节点后,如果sql条件比他大,会去继续读取右边的叶子节点,反之读取左边的叶节点,然后再进行判断。使用二分查找法,找到目标数据后,这里会根据不同的索引,来执行不同的操作:Innodb聚簇索引直接从索引树中得到的行数据,因为行数据和聚簇索引存储在一块;Innodb次级索引:看是否能够使用索引覆盖机制获取数据,不行则触发回表动作获取数据。MyISAM的索引:根据索引键中记录的磁盘地址,直接从磁盘中读取行数据。读取到一个目标数据后,如果是基于主键/唯一索引在查询,则会立马停止查找,如果是普通索引则会继续向下遍历。如果是范围查询操作,会直接根据叶子节点的前后指针,获取其他的索引键数据,然后重复根据不同索引查找数据的过程,得到目标行数据。

    10. 写入语句执行时,会对索引产生什么影响? 增: 如果索引字段具备自增特性,直接把插入的字段数据作为索引键,追加到索引树最后一个节点存储。 如果索引字段是无序的,则先对其排序计算(字符串转换为ascii码),计算出一个位置并插入。 删: 会先根据删除的条件查找索引树,接着去聚簇索引树查找对应的行数据,先删其他次级索引的数据,接着再删行数据和聚簇索引键。 改: 和删数据类似,先找到数据,再改行数据,再改聚簇索引键,再改次级索引数据。

    11. 索引最左匹配原则是基于联合索引而言的,好比一个联合索引由A,B,C三个字段组成,那么在写sql语句时,最好按照索引字段的顺序来使用索引,如果sql中不包含第一个A字段,一般无法使用这个联合索引查找数据,同时,如果查询语句中使用A,C字段,但没有使用B字段,也无法完全利用联合索引。因为mysql的联合索引会从左往右匹配数据,所以在设计联合索引的时候,最好把查询频率较高的字段放在前面,这样才能充分利用最左匹配原则查询数据,但mysql8.0也推出了一种名为索引跳跃式扫描的机制,可以打破联合索引的最左匹配原则。