数据引擎想要一个合适的索引哟

索引篇

为了提高数据的查询效率,我们要使用索引的帮助。

索引的常见索引模型有:有序数组,hash集合,搜索树的方式建立索引模型

  1. 有序数组:按照顺序进行查找,使用二分法可进行快速查找,时间复杂度为O(log(N))。[查询效率高,更新效率低,适合静态存储引擎]
  2. hash集合:以key-value的形式存在,按照等值判断(通过hash方法计算位置),通过链表的方式解决冲突.[适合只有等值查询的场景使用]
  3. 搜索树:每个节点左侧子节点小于父节点,右侧子节点大于父节点,查询时间复杂度O(log(N)),更新时间复杂度O(log(N))[更新优于有序数组,支持范围查找]

索引类型:主键索引(聚簇索引)、非主键索引(二级索引)
主键索引的叶子节点存的是整行的数据(),非主键索引的叶子节点内容是主键的值(二级索引)
两者的区别就是普通索引需要回表的操作

针对存储结构和性能方面,自增主键往往是最合理的选择

mysql索引我们可以选择唯一索引和普通索引,分别简单了解一下各个索引的使用场景
首先要从两种索引对查询语句和更新语句的性能影响来进行分析

  1. 查询

对于普通索引来说,查找到满足条件的第一个记录后,需要查找下一个记录,直到碰到第一个不满足条件的记录。
对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。

两种方式对于查询语句的应该微乎其微,对于普通索引只是多一次查找和判断下一条记录,这对 cpu来说的操作成本可以忽略不计.

  1. 更新

InnoDB change buffer 操作

当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB会将这些更新操作缓存在change buffer中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行change buffer中与这个页有关的操作。
如果能够将更新操作先记录在change buffer,减少读磁盘,语句的执行速度会得到明显 的提升。而且,数据读入内存是需要占用buffer pool的,所以这种方式还能够避免占用内存,提高内存利用率。

对于唯一索引来说所有更新操作都要判断是否违反唯一性原则,因此只有普通索引可以使用change buffer.

如果更新一条数据,更新的目标页在内存中,唯一索引只是比普通索引增加一个判断,都会更新到内存.
如果更新的目标页不在内存,唯一索引要读入内存判断,再进行插入操作.普通索引则是直接更新在change buffer中.
磁盘读入内存涉及随机IO的访问,是数据库里面成本最高的操作之一.
change buffer 因为减少了随机磁盘访问,所以对更新性能的提升是会很明显的。
change buffer 使用场景

change buffer的主要目的就是将记录的变更动 作缓存下来,所以在一个数据页做merge之前,change
buffer记录的变更越多(也就是这个页面 上要更新的次数越多),收益就越大。

因此,对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时change buffer的使用效果最好.

猜你喜欢

转载自blog.csdn.net/weixin_41476211/article/details/106049025