MySQL分页查询
mysql的分页查询需要用到关键字 limit ,limit其实是mysql给的一个函数,就像是count(*)求和一样的函数,可以传入参数使用。
LIMIT 可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)
使用limit进行分页查询
第一种情况,只传一个参数:
SELECT * FROM 表 LIMIT 2
该结果返回前两条数据。
第二种情况 也就是我们分页的sql实现
SELECT * FROM 表 LIMIT 2,10
查询第1条到第10条的数据的sql是:select * from table limit 0,10; ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;
查询第10条到第20条的数据的sql是:select * from table limit 10,20; ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;
查询第20条到第30条的数据的sql是:select * from table limit 20,30; ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10;
所以我们可以清楚的得到
*分页sql格 select * from table limit (page-1)pageSize,pageSize; 其中page是页码,pageSize是每页显示的条数。
使用limit的效率问题
如果你仅仅知道limit,分页就使用limit确实很简单,但是面对大量数据的时候要对sql进行优化,提高查询效率,比如下面的sql的执行
select * from 表 limit 10000,10;
扫描前面10010行,返回最后10行,我懵了,前面查的1万行就直接不用
在数据量级到一定程度,limit方法会让查询变的没有效率。也就是说,分页越往后,查询到饿速度越慢。
我们要提高效率可以使用子查询
一般我们表种都有主键id,以下你可以自己去验证。
select * from 表 where id = 1 limit 200000 ,20;
select id from 表 where id = 1 limit 200000 ,20;
第二个只查询id肯定比第一个查询所有字段的效率要高,这个我们都应该知道。
利用第二种查询id的方法,进行优化limit的语句。
SELECT * FROM 表 WHERE ID > =(select id from xxx limit 1000000, 1) limit 20;
SELECT * FROM 表 a JOIN (select id from 表 limit 1000000, 20) b ON a.ID = b.id;