这个是在一年前做性能优化测试时发现的,当时测试的版本是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、测试目的
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快的原因。
测试 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快的原因。
测试 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快的原因。