For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
数据库架构开发是大多数后端开发程序员都需要熟练掌握的一个编程知识点,而本文我们就通过案例分析来简单了解一下,java编程索引基本读取操作。
回表(磁盘随机I/O)
在innodb存储引擎中,由主键索引去组织完整用户记录数据,而辅助索引来组织其他字段的排序记录。
当我们查询需要通过辅助索引来查找数据的时候,innodb存储引擎会先到辅助索引去找到匹配的记录对应的主键。在通过主键到主键索引找到相关的完整用户记录,这个过程就叫做回表。
因此根据辅助索引来查询数据,需要使用到两颗B+树(辅助索引+主键索引)。
为什么需要回表,为什么不能把完整用户记录存储到二级索引呢(用二级索引来组织完整用户记录数据)?
如果我们把完整用户记录存储到二级索引的话,确实是不需要回表,按道理上来讲效率确实会高一些。
但是我们建立多个索引的情况下,每个索引都存储完整用户记录的话,会浪费大量的存储空间。
其次在项目中我们进行增删改某一条完整用户记录中的某个字段数据的时候,我们还需要去维护表中所有的B+树的索引叶子节点的数据,可想而知,这个性能很低的。
MRR多范围读取(二级索引范围查询后主键无序,排序后回表)
MRR全名称:Disk-SweepMulti-RangeRead
当表的数据量很大的时候,在二级索引使用范围查询可能会导致的大量的磁盘随机I/O(回表导致)。
使用MRR,可以在扫描索引后,将索引对应的主键keys进行排序后,通过有序的主键去访问主键索引
这样可以减少对磁盘的随机I/O,进行对主键索引更多的顺序读
在回表中,我们根据辅助索引中筛选匹配,根据记录的主键值到主键执行回表操作。那么在辅助索引中筛选匹配的主键记录,存储两种情况。一种情况主键值有序,这种一般是等值匹配查询(例如建立索引name,那么name字段等值匹配相同的情况,主键id是有序的,建立索引name其实跟建立索引(name,id)是一个意思)。二种情况是主键值无序,这种一般是范围查询。
当我们每次回表都会去随机读取一个聚簇索引的页面(磁盘随机I/O)。这些随机I/O带来的性能开销比较大。因此就出现了MMR多范围读取来进行优化这一步骤。针对于以上二种情况而言,每次读取一部分的主键值,进行排好序后在统一执行回表操作。这样虽然是随机I/O,但是有序相连数据,磁盘的页与页之间的寻址就不需要太久。
使用MMR多范围读取,相比每次从辅助索引读取一条主键值,就去回表会减少一些磁盘随机I/O。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。