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

相关文章
|
25天前
|
存储 算法 关系型数据库
深入理解InnoDB索引数据结构和算法
1. **索引定义**:索引是提升查询速度的有序数据结构,帮助数据库系统快速找到数据。 2. **索引类型**:包括普通索引、唯一索引、主键索引、空间索引和全文索引,每种有特定应用场景。 3. **数据结构**:InnoDB使用B+树作为索引结构,确保所有节点按顺序排列,降低查询时的磁盘I/O。 4. **B+树特性**:所有数据都在叶子节点,非叶子节点仅存储索引,提供高效范围查询。 5. **索引优势**:通过减少查找数据所需的磁盘I/O次数,显著提高查询性能。 **总结:**InnoDB索引通过B+树结构,优化了数据访问,使得查询速度快,尤其适合大数据量的场景。
27 0
深入理解InnoDB索引数据结构和算法
|
2月前
|
存储 安全 关系型数据库
|
2月前
|
存储 算法 关系型数据库
InnoDb行格式、数据页结构、索引底层原理和如何建立索引
InnoDb行格式、数据页结构、索引底层原理和如何建立索引
63 0
|
13天前
|
存储 关系型数据库 MySQL
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
28 0
|
3月前
|
存储 关系型数据库 MySQL
MySQL存储引擎 InnoDB、MyISAM、Memory存储引擎的特点与区别
MySQL存储引擎 InnoDB、MyISAM、Memory存储引擎的特点与区别
56 0
|
3月前
|
存储 SQL 关系型数据库
二十、MySQL技术体系之InnoDB存储引擎的索引
二十、MySQL技术体系之InnoDB存储引擎的索引
58 0
|
4月前
|
存储 关系型数据库 MySQL
MySQL 中InnoDB与MyISAM的区别是什么?
MySQL 中InnoDB与MyISAM的区别是什么?
64 0
MySQL 中InnoDB与MyISAM的区别是什么?
|
4月前
|
存储 关系型数据库 MySQL
MySQL哈希索引以及InnoDB自适应哈希索引
MySQL哈希索引以及InnoDB自适应哈希索引
46 0
MySQL哈希索引以及InnoDB自适应哈希索引
|
4月前
|
存储 SQL 关系型数据库
InnoDB主键索引树和二级索引树
InnoDB主键索引树和二级索引树
42 0
InnoDB主键索引树和二级索引树
|
4月前
|
存储 关系型数据库 MySQL
MySQL ⽀持哪些存储引擎?默认使⽤哪个?MyISAM 和 InnoDB 引擎有什么区别,如何选择?
MySQL ⽀持哪些存储引擎?默认使⽤哪个?MyISAM 和 InnoDB 引擎有什么区别,如何选择?