sqlserver2012和mariadb 10.0.3分页效率的对比
1. 实验环境
r910服务器, 16g内存
sqlserver 2012 64bit
mariadb 10.0.3 64bit (innodb)
2. 实验表情况
rtlbill.billno 为主键, rtlbill.billdate 上有索引;
rtldetail.billno 上有索引;
3. 实验步骤
(1)重启sqlserver2012
(2)执行下面的分页语句
select billdate, sum([qty]) posinqty from rtldetail a,rtlbill b where a.billno = b.billno and billdate>='2009-09-25 00:00:00' and billdate<='2012-09-25 23:59:59' group by billdate order by billdate offset 10row fetch next20rows only;
(3)重启mariadb
(4)执行下面的分页语句
select billdate, sum(qty) as posinqty from rtldetail a,rtlbill b where a.billno = b.billno and billdate>='2009-09-25 00:00:00' and billdate<='2012-09-25 23:59:59' group by billdate order by billdate limit 10,20;
4. 实验结果
同样是获取第 11 ~ 30 条记录
server2012耗时:18s
mariadb耗时: 2s
这个差别还是挺震撼的,是什么导致了二者的巨大差距?
下面来看看执行前后二者的io对比。
5. 分析
(1)从下图中可以看出,为了获取分页数据,mariadb读取了 52m 数据
(2)为了获取相同的数据,sqlserver2012,读取了 848m 数据
(3)二者的差距,就在分页数据的读取策略上。sqlerver2012为了读取分页子集,几乎把整个表都放入了内存。不得不说,这块儿优化的空间很大。。。