Mysql 深分页 优化方案之一
数据:单表数据25万条。
1.基本分页:耗时0.019秒
select * from order_info limit 0,20
2.深度分页:耗时10.236秒
select * from order_info limit 200000,20
3.深度ID分页:耗时0.052秒
提示:如果这一步很慢,count(1) 查询总数应该也会很慢-解决方式:请为主键加上unique索引。
- 主键ID字段:id
select id from order_info limit 200000,20
4.两步走深度分页:耗时0.049秒+0.017秒
基于第三步的缺陷(只能查出ID信息),我们可以先查出分页数据的ID,在根据ID查询数据。
select id from order_info LIMIT 200000,20
select * from order_info where id in (
'330681650000202108180227345510',
'330681650000202108171031534500',
'330681650000202108190251532141',
'330681650000202108200246376830',
'330681650000202108210229398665',
'330681650000202108220236113895',
'330681650000202108230230034133',
'330681650000202108231017279739',
'330681650000202108231043456276',
'330681650000202108231051404340',
'330681650000202108240237397251',
'330681650000202108250221489228',
'330681650000202108250241536726',
'330681650000202108260253039326',
'330681650000202108270216016138',
'330681650000202108280234013754',
'330681650000202108290230029720',
'330681650000202108300255579204',
'330681650000202108310234184991',
'330681650000202109010237315937'
);
两步合成一步SQL耗时:11.9秒;这一步着实出乎了我的意料。
5.一步走深度分页:耗时0.05秒
这一步是对第四步的优化,毕竟两条SQL还需要码代码。利用join 两条SQL合成一条。
SELECT
*
FROM
order_info a
JOIN ( SELECT id FROM order_info LIMIT 200000, 20 ) b ON a.id= b.id
6.集成BeanSearcher框架
原理是使用了BeanSearcher的sql拦截器对SQL进行拦截改造。