tokudb desc查询比acs查询慢问题定位

本文针对mysql-5.5.30-tokudb-7.0.1、mysql-5.5.41-tokudb-7.5.5和percona 5.6.24-72.2三个版本进行测试,发现DESC查询比ASC查询慢。通过栈信息对比,发现ASC查询使用了read_multi_range_next函数导致更快,而DESC查询未使用该函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个是在一年前做性能优化测试时发现的,当时测试的版本是mysql-5.5.30-tokudb-7.0.1、mysql-5.5.41-tokudb-7.5.5 、percona 5.6.24-72.2这三个版本。

后来看到官方说是一个bug.

具体的bug看https://github.com/mysql/mysql-server/commit/da1d92fd46071cd86de61058b6ea39fd9affcd87


具体看下面的测试:


1、测试方法:

物理读测试(磁盘读):测试前重启MYSQL并且清空OS缓存,并执行sql保证mysql已经打开测试表相关文件(当一个表下文件比较多的时候,打开文件也是比较耗时的)。

[root@slave159 ~]# sync;echo 1>/proc/sys/vm/drop_caches;/etc/init.d/mysql3307 restart; mysql  -uroot -h 192.168.60.159 -P3307 changzhou_5000
mysql> select * from sjkk_gcjl limit 0;

内存读测试:紧接着第二次执行查询,并nmon监控没有物理读。


2、测试一

2.1、测试目的

测试mysql-5.5.30-tokudb-7.0.1版本tokudb引擎表是否存在DESC比ASC查询慢的问题。
2.2、测试环境

VERSION: mysql-5.5.30-tokudb-7.0.1

DB:changzhou_2yi

数据量:2亿左右

升序测试


降序测试



测试结论

 mysql-5.5.30-tokudb-7.0.1版本存在查询DESC比ASC慢的问题。

DESC比ASC查询慢问题定位
DESC栈信息


说明:

 DESC查询语句在提取数据部分用到的函数:

QUICK_SELECT_DESC::get_next()  ------> ha_tokudb::index_prev(unsigned char*) ------> ha_tokudb::get_next(unsigned char*, int, __toku_dbt*)


ASC栈信息

说明:

  ASC查询语句在提取数据部分用到的函数:

QUICK_RANGE_SELECT::get_next()------>handler::read_multi_range_next(st_key_multi_range**)------> ha_tokudb::read_range_next() ------>  handler::read_range_next() -----> ha_tokudb::index_next(unsignedchar*) ----->ha_tokudb::get_next(unsigned char*, int, __toku_dbt*)

从这里可以看出ASC在提取数据时比DESC多了三个函数,分别是handler::read_multi_range_next()、ha_tokudb::read_range_next()、handler::read_range_next()。

其中read_multi_range_next函数(连续多块读),这个应该是ASC比DESC快的根本原因。

问题定位结论

    mysql-5.5.30-tokudb-7.0.1版本DESC比ASC快的原因是MYSQL层调用TOKUDB引擎时使用了不同类型的函数。在ASC查询时使用到了read_multi_range_next函数(连续多块读),是造成ASC比DESC快的原因。




3、测试二
测试目的

测试 mysql-5.5.41-tokudb-7.5.5 版本tokudb引擎表是否存在DESC比ASC查询慢的问题。


测试环境

VERSION:mysql-5.5.41-tokudb-7.5.5

DB: changzhou_5000  

数据量: 5000w+

升序测试


降序测试



测试结论

mysql-5.5.41-tokudb-7.5.5 版本存在DESC比ASC慢的问题。

DESC比ASC查询慢问题定位
DESC栈信息


ASC栈信息

问题定位结论

mysql-5.5.41-tokudb-7.5.5版本DESC比ASC快的原因是MYSQL层调用TOKUDB引擎时使用了不同类型的函数。在ASC查询时使用到了read_multi_range_next函数(连续多块读),是造成ASC比DESC快的原因。



4、测试三
测试目的

测试 percona 5.6.24-72.2 版本tokudb引擎表是否存在DESC比ASC慢的问题

测试环境

VERSION: percona 5.6.24-72.2 

DB:changzhou_5000

数据量: 5000w+

升序测试

降序测试



测试结论

percona 5.6.24-72.2 版本 查询DESC比ASC慢


DESC比ASC查询慢问题定位

DESC栈信息


ASC栈信息


问题定位结论

percona 5.6.24-72.2版本DESC比ASC快的原因是MYSQL层调用TOKUDB引擎时使用了不同类型的函数。在ASC查询时使用到了read_multi_range_next函数(连续多块读),是造成ASC比DESC快的原因。
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值