共同点
两种查询方式,对应limit offset, size和limit size两种方式。
而其实limit size, 相当于limit 0, size。也就是从0开始取size条数据。
区别
也就是说,两种方式的区别在于offset是否为0。
内部执行逻辑
先来看下limit sql的内部执行逻辑,MySQL内部分为server层和存储引擎层一般情况下存储引擎都用innodb。server层有很多模块,其中需要关注的是执行器是用于跟存储引擎打交道的组件。
执行器可以通过调用存储引擎提供的接口,将一行行数据取出。
当这些数据完全符合要求(比如满足其他where条件),则会放到结果集中,最后返回给调用mysql的客户端。
举例说明
以主键索引的limit执行过程为例:
执行select * from page order by id limit 0, 10;
select后面带的是星号,也就是要求获得行数据的所有字段信息。
server层会调用innodb的接口,在innodb里的主键索引中获取到第0到第10条完整行数据,依次返回给server层,并放到server层的结果集中,返回给客户端。
把offset搞大点,比如执行的是select * from page order by id limit 500000,10;
server层会调用innodb的接口,由于这次的offset=500000,会在innodb里的主键索引中获取到第0到(500000 + 10)条完整行数据,返回给server层。
之后根据offset的值挨个抛弃,最后只留下最后面的size条,也就是10条数据,放到serer层的结果集中,返回给客户端。
可以看出,当offset非0时,server层会从引擎层获取到很多无用的数据,而获取的这些无用数据都是要耗时的。
结论
因此,mysql查询中limit 500000,10会比limit更慢。
具体原因
原因是limit 500000,10会取出500000 + 10条数据,并抛弃前500000条,这部分耗时更大。