Innodb:使用索引避免排序后DESC和ASC的区别

简介: Innodb:使用索引避免排序后DESC和ASC的区别

一、问题由来

这个问题是朋友提出的,大概意思就是说,Innodb 的记录中只会包含rec next的位置,那么块内部反向扫描如何完成的,比如使用索引避免排序后的DESC操作。实际上这个问题可以简单描述为Innodb 块内部是单向链表,如果要反向扫描那么是如何的。


二、相关接口

实际上对于正向和反向扫描记录使用的方法并不一致,大概的接口为:

正向:page_rec_get_next_low

这里很容易看出就是通过rec next位置来确认下一条记录,这非常容易也非常简单,代价极小。

反向:page_rec_get_prev_const

这个函数实际上可以简单的看一下就知道获取prev(上一条记录)就复杂了一些,它通过slot来进行定位,然后进行循环比对来获取上一条记录。


三、反向(DESC)大概获取流程

首先我们要清楚slot是干什么的,实际上在定位数据的时候会先定位到slot,然后再在slot内部做一个二分法。slot对于记录来讲是有序的,即逻辑上是顺序的(非物理顺序)。一个slot为2字节存储的是对应记录的偏移量,而一个slot最多包含8条记录,关于slot的讲解很多书籍都有说明,不再赘述。

好了我们假设上一次读取到的prev row = G,而slot内部包含了A、B、C、D、E、F、G 7条记录。

第一步定位到slot的开头即记录A的位置。


LOOP:设置本次 prev row = A
通过A的rec next位置获取下一条记录 B
是否 B == G
{如果是则记录prev row= A 停止循环}
否则
{继续循环,下一次循环prev row = B }

LOOP:设置本次 prev row = A

通过A的rec next位置获取下一条记录 B

是否 B == G

{如果是则记录prev row= A 停止循环}

否则

{继续循环,下一次循环prev row = B }

这个循环一直要持续到 prev row = F ,即 G == G 成立才结束。循环次数为6次。

可以看到这样上一条记录就找到了,不过看起来代价比ASC方式大了很多很多。


四、如何避免

MySQL 8的降序索引值得拥有。或者规避这个问题。


五、debug栈帧和结果

1、DESC 多次循环

image.png

2、调用栈帧

image.png

            </div>
相关文章
|
存储 机器学习/深度学习 人工智能
AI仓库管理
AI仓库管理运用人工智能优化存储、订单处理、路径规划和库存管理,提高效率、准确性,降低成本。包括智能存储推荐、订单分配、拣选路径规划、图像识别、自然语言处理、预测分析、自动化操作和实时库存跟踪。此外,集成物联网、无人机、机器人和区块链技术,提升效率和安全性。AI仓库管理为商家带来智能化决策支持和自动化解决方案。
1175 1
|
11月前
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
|
机器学习/深度学习 开发者 数据格式
Gradio如何使用
**Gradio** 是一个开源 Python 库,用于快速创建和部署机器学习模型的用户界面。它支持多种输入输出形式,如文本、图像、音频等,无需复杂 Web 开发知识即可实现模型的直观展示和交互。Gradio 特点包括简单易用、实时更新、多样的输入输出形式以及轻松部署。通过几个简单的步骤,即可创建和分享功能强大的机器学习应用。
504 0
|
传感器 物联网 网络虚拟化
物联网卡怎么取消区域限制
物联网卡(IoT SIM卡)通常用于连接物联网设备,如智能城市设备、工业传感器、车载设备等,以实现数据的远程传输和设备的远程管理。物联网卡通常会有区域限制,即只能在特定的地区或国家内使用。取消物联网卡的区域限制并不是一个直接的操作,因为这通常取决于服务提供商的政策和合同条款。不过,以下是一些可能的步骤和建议,可以尝试来解除或绕过这些限制:
|
数据采集 监控 数据可视化
用Python构建动态折线图:实时展示爬取数据的指南
本文介绍了如何利用Python的爬虫技术从“财富吧”获取中国股市的实时数据,并使用动态折线图展示股价变化。文章详细讲解了如何通过设置代理IP和请求头来绕过反爬机制,确保数据稳定获取。通过示例代码展示了如何使用`requests`和`matplotlib`库实现这一过程,最终生成每秒自动更新的动态股价图。这种方法不仅适用于股市分析,还可广泛应用于其他需要实时监控的数据源,帮助用户快速做出决策。
568 0
|
存储 安全 数据安全/隐私保护
网络信息安全基本属性
常见的网络信息安全基本属性主要有机密性、完整性、可用性、不可抵赖性和可控性等,其中机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)被称为网络信息系统核心的CIA安全属性,此外还有其他的安全属性包括:真实性、时效性、合规性、隐私性等。
1140 0
|
安全 JavaScript 小程序
云支付官方FAQ
云支付官方小二实时更新的浓缩FAQ,帮助广大服务商快速定位问题。
复制宝贝上传到淘宝店铺后,如何批量修改运费模板?
原文来源:(http://www.daxiangce.com/space-5760-do-blog-id-1316.html) 有很多店主有这样的烦恼,批量复制宝贝上传到店铺后,才发现没有在大淘营下载配置的第二步选择一个运费模板,而是直接复制的上家宝贝的运费模板,但是宝贝都已经复制上传到店铺了,现在再去将运费模板设置为自己的运费模板,很明显是来不及了的,那么,批量复制上传宝贝到淘宝店铺,怎么样批量去修改运费模板?
|
固态存储 iOS开发 MacOS
Mac mini--使用外置SSD启动系统
内置机械磁盘的mac mini如何使用外置SSD磁盘启动,
4334 0
Mac mini--使用外置SSD启动系统