mysql供应分页的功用:
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
最简朴的用法就是:
select * from table limit ?,?
这类是最简朴的limit分页查询。合营where前提运用:
select * from table where column > ? order by id limit ?,?
上边这类状况,发起在column和id竖立复合索引比较好。
以上两种状况,关于小数据量分页查询时,如许的sql就充足用了。然则关于百万级以上的数据表,假如运用上边的sql 的话,越往后limit语句的偏移量越来越大,查询就会变得越来越慢。类似于:
select * from `user` where `cate`='陕西' order by id limit 100000,10
为了防止这类查询,我们能够经由过程子查询的体式格局来进步查询效力。
select * from `user` where id >=(select * from `user` where `cate`='陕西' order by id limit 100000,1) and `cate`='陕西' limit 10
经由过程explain我们能够看出直接limit查询和经由过程子查询的差异:
直接limit查询:
type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|
ALL | (NULL) | (NULL) | (NULL) | (NULL) | 4076607 |
子查询分页查询:
type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|
PRIMARY | range | PRIMARY | PRIMARY | 4 | 2038331 | Using where |
SUBQUERY | index | (NULL) | PRIMARY | 4 | 4076663 | Using index |
能够看出,经由过程子查询的体式格局,子查询是在索引上举行的,而一般的查询是在数据文件上举行的。 一般来讲,索引文件要比数据文件小的多,所以操纵索引文件更直接高效。
另外,还能够经由过程join分页体式格局
SELECT * FROM `user` AS t1 JOIN (SELECT id FROM `user` ORDER BY id LIMIT 100000, 1) AS t2 WHERE t1.id <= t2.id ORDER BY t1.id LIMIT 10;
join分页和子查询分页的效力基础在一个品级上。(然则,子查询须要在内存中竖立暂时表,查询终了后,MySQL须要打消这些暂时表。经由过程join能够防止这类状况)在分页查询前,能够举行推断,假如是在限制页数内,就运用基础分页查询,大于则运用子查询分页处置惩罚。
相干引荐:
mysql分页机能探究
MySQL分页优化的测试案例
MySQL分页机能优化指南
以上就是mysql分页查询实例解说的细致内容,更多请关注ki4网别的相干文章!