对于比较多的数据,如果在一个页面全部显示,查看起来会眼花缭乱。如果能进行分页显示,将更加快捷、清新的浏览!
这样,我们也容易查看前几条或者中间某几行数据。
语法(格式):SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset;
说明:LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量(索引),第二个参数指定返回记录行的最大数目(显示的个数)。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
例如:对product表进行分页查询:
SELECT * FROM product LIMIT 0,3;
SELECT * FROM product LIMIT 3,3;
以上2条语句执行之后,可以看到,索引第一个是0,第二个是3,而后面的(显示的个数)都是3。
不难看出,startIndex = (index-1)*3 startIndex是索引值,index是页数,3是显示的个数。
另外,我们看看以下两种写法的显示结果:
1.SELECT * FROM product LIMIT 2,3;
我们反过来推算,2对应pid从3开始,0对应pid从1开始,同样都是显示3条数据,那么1对应pid应该是从2开始
显示结果正如猜测一致!
简单理解,索引(如:0)对应数据表的第1条数据(如:product的pid的值为1);显示的个数3,就是每次每页显示的数据3条。
2.SELECT * FROM product LIMIT 3;
不难看出,我们是省去了索引值(只给定一个参数),它表示返回最大的记录行数目(如:3)。
如果改成5,也就会显示前5条记录
Mysql的分页查询语句的性能分析
MySQL的LIMIT语法相对其他的数据库(语句、语法)显得优雅,使用LIMIT来分页效率更高!
最基本的分页方式:SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...
在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引。
子查询的分页方式:
随着数据量的增加,页数会越来越多,查看后几页的SQL,例如:
然而,就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。
此时,我们可以通过子查询的方式来提高分页效率,大致如下:
JOIN分页方式:
例如:
可以进行测试,join分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致。
为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。
实际可以利用类似策略模式的方式去处理分页,比如判断如果是一百页以内,就使用最基本的分页方式,大于一百页,则使用子查询的分页方式。
持续更新之中...