一般分页查询
语法格式:
SELECT * FROM table LIMIT stratIndex,pageSize
Limit限制的是从结果集的stratIndex位置处取出pageSize条输出,其余抛弃,stratIndex越大,查询性能就越低。
示例:
select * from table order by id limit 10, 100;
Limit适应场景: 适用于数据量较少的情况,原因是: 全表扫描,速度会很慢。
子查询优化
在中小数据量的情况下,这样的SQL就足够了,随着数据量的增多,页数越来越多,查看最后几页的SQL就会很慢。
如下所示:
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 1000, 10
所以,分页越往后,数据量越大,偏移量就可能很大,分页的速度就会变慢,这时用子查询方式来提高分页效率。
如下所示:
SELECT * FROM articles WHERE id >= (SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10
为什么子查询快?
因为子查询是在索引上完成的,而普通的查询是在文件数据文件上完成的。
id 限定优化
这种方式假设数据表的id是连续递增的,则我们根据查询的页数和查询的记录数可以算出查询的id的范围,可以使用 id between and 来查询:
select * from orders_history where type=2 and id between 1000000 and 1000100 limit 100;
这种查询方式能够极大地优化查询速度,基本能够在几十毫秒之内完成。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》