为什么向后扫描索引较慢?

Fed*_*oli 2 mysql innodb index

实证测试表明,在 InnoDB 表上进行这样的查询:

SELECT indexed_column FROM tab ORDER BY indexes_column ASC;
Run Code Online (Sandbox Code Playgroud)

ORDER BY ... DESC. 为什么会这样?

注意:我使用 MySQL 5.7 和 5.6 进行了测试。所以这与 8.0 中的升序索引无关。

ype*_*eᵀᴹ 7

相关文章MySQL 8.0 Labs – Descending Indexes in MySQL的作者 Chaithra Gopalareddy在评论中解释了为什么向后索引扫描比向前扫描效率稍低:

感谢您对新功能表现出兴趣。在〜15%的成本效益 的正向扫描可以归因于在InnoDB中做有利于对反向扫描正向扫描优化

例如:在页面内扫描 - 页面中的记录形成一个单向链表。要获取下一条记录,前向扫描只遵循链接,因为后向扫描需要从头(第一个槽)开始,直到当前槽/记录,以识别前一条记录。

除了上述之外,还有一些更多的影响因素,例如,在页面切换期间 -当前在 innodb 中定义的页面锁存规则有利于向前扫描而不是向后扫描。

所以有两个因素:

  • 页面内记录的链表结构
  • 关于页面切换的页面锁存规则