一种情况,limit接受一个参数,即是返回记录的前面最大行数
另一情况,limit接受两个参数,一个是返回记录行的偏移量,一个是返回记录行的最大数量
用法1:
limit rows
select * from user order by id limit 5;
返回记录的前5行。
用法2:
limit offset, rows
select * from user order by id limit 5,10;
偏移量是5行,从第6行开始,返回记录的10行,返回6 - 15行记录。
在实际的开发应用中,分页功能我们可以使用limit来实现数据库的查询,但当分页越往后数,性能会慢慢变差,如:
limit 10000,20
使用explain分析下SQL查询:
> explain SELECT * FROM user ORDER BY id ASC LIMIT 10000, 20
***************** 1. row **************
id: 1
select_type: SIMPLE
table: user
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 10020
Extra:
1 row in set (0.00 sec)
我们看到,只为查询20行记录,但却查询出10020行记录,先抛掉前面的10000记录,再取出20行记录,这性能太差了。
limit中影响性能的是第一个参数:偏移量,所以我们应该尽可能地使得偏移量变小。
上面的优化,我们可以这样
select * from user where id > 10000 order by id asc limit 20;
这样我们只是查询出20行就可以了。
在查询上一页时,可以这样:
select * from user where id <= 10000 order by id desc limit 20;
不过,在实际中,不仅仅有上一页,下一页,往是这样的:首页,上一页 1 2 3 。。。18 19 20 下一页 尾页