常用关键字 offset 和 limit
注:本案例表只有自增主键,没有添加其他索引
OFFSET 和 LIMIT 对于数据量少数据的查询对比不出来效果
当数据库里的数据量超过服务器内存能够存储的能力,并且需要对所有数据进行分页,问题就会出现。
为了实现分页,每次收到分页请求时,数据库都需要进行低效的全表扫描。
什么是全表扫描?全表扫描 (又称顺序扫描) 就是在数据库中进行逐行扫描,顺序读取表中的每一行记录,然后检查各个列是否符合查询条件。
这种扫描是已知最慢的,因为需要进行大量的磁盘 I/O,而且从磁盘到内存的传输开销也很大。
这意味着,如果你有 1 亿个用户,OFFSET 是 5 千万,那么它需要获取所有这些记录 (包括那么多根本不需要的数据),将它们放入内存,然后获取 LIMIT 指定的 20 条结果。
下来看下示例
EXPLAIN SELECT * FROM `orders_detail` LIMIT 10 , 20;
EXPLAIN SELECT * FROM `orders_detail` LIMIT 10 OFFSET 20;
EXPLAIN SELECT * FROM `orders_detail` WHERE id > 10 LIMIT 10;
主键的索引绝对命中,其实有时候在做优化时,也可以根据自身的场景进行索引的添加。
我个人建议在需要分页的表中使用自动递增的主键,即使只是为了分页。