mysql深度分页优化研究

使用sysbench造数

由于想得到大批量的测试数据,可以借助sysbench工具

1.安装sysbench

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
yum -y install sysbench

检查安装是否成功

sysbench --version

2.造一千万测试数据

xxx部分分别填你自己mysql主机地址\用户名\密码\数据库名

sysbench --db-driver=mysql --threads=4 --mysql-host=xxx --mysql-port=3306 --mysql-user=xxx  --mysql-password=xxx --mysql-db=xxx --tables=1 --table_size=10000000 oltp_read_write --db-ps-mode=disable prepare

深度分页测试

测试从8000000开始查询15条数据

select * from sbtest1 limit 8000000,15;

在我的机器上多次测试评价耗时 6.5s多

改进一下

select a.* from sbtest1 a,(select id from sbtest1 limit 8000000,15) b
where a.id=b.id;

多次测试平均耗时1.5s多,还是挺快的
但是,我们会发现两次查询的数据不一样,用自增id排序一下就可以得到一致的数据

select a.* from sbtest1 a,(select id from sbtest1 ORDER BY id limit 8000000,15) b
where a.id=b.id;

这时候sql的执行多次测试平均3.5s,看嘛,这也比6.5s快不了多少.
分析:①和②③的区别其实就是②③中都是子查询先查询出来id范围再从这个范围筛选最终结果,用到了id(聚族索引)索引覆盖避免了回表,而①中由于select * 没有用到索引,可以在sql语句前面加上explain 查看执行计划
①的执行计划
在这里插入图片描述
③的执行计划
mysql深度分页优化研究_第1张图片

但是数据量大了,深度分页你从sql层面再怎么优化也不会太快,彻底解决这个问题还是从业务层面不允许深度分页(例如百度只让你查76页),其实深度分页的意义在实际业务场景不大,排除无聊的人谁会愿意翻到几百万页后查看数据呢?

总结

必须深度分页场景,可以利用延迟关联或者子查询优化超多分页场景,先快速定位需要获取的 id 段,然后再关联

SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id

如果对性能要求特别高,还是从业务上避免深度分页的问题。

你可能感兴趣的:(mysql,mysql,数据库,sql)