一、基本概念
MySQL的LIMIT语句用于在查询中返回一定数量的结果子集,用于数据分页中非常常见。它可以一次查询多行数据,控制查询结果的数量以及起始位置。LIMIT语法结构如下:
LIMIT [offset,] rows;
其中,rows
是必选项,表示查询结果要返回的行数。offset
为可选项,表示结果集合的起始位置,默认从0开始。
使用LIMIT分页功能必须保证结果集有序,否则会出现重复数据或遗漏数据的问题。
二、使用方法
1. 基本分页
我们来看一个最简单的分页查询实例。查询student表中第6~10条记录的SQL语句为:
SELECT * FROM student LIMIT 5, 5;
其中5为偏移量,表示跳过前面的5条数据,5表示返回5条数据。可以看出,如果要查询第N页(每页M条数据)的数据,偏移量应该为(M×(N-1))。
当查询第1页时,偏移量为0。这里将第1页和每页N条数据定义为常量方便启用:
define('PAGE_SIZE', 10);
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$offset = PAGE_SIZE * ($page - 1);
$sql = "SELECT * FROM student LIMIT {$offset}, " . PAGE_SIZE;
2. 自定义排序
LIMIT分页的关键在于保证结果集有序,如果结果集无序,则会出现重复数据或遗漏数据的问题。同时在 ORDER BY 语句中也需要指定排序列和排序方式。
例如查询student表,根据age升序排序。查询第6~10条记录的SQL语句为:
SELECT * FROM student ORDER BY age ASC LIMIT 5, 5;
其中,偏移量为5,也就是跳过前5条记录,返回5条记录。这里的排序字段可以根据实际需要进行替换。
3. 分页的性能优化
在分页处理大量数据的时候,LIMIT语句的效率越来越低。这是因为LIMIT采用了通过遍历前N条记录来返回数据的方式,前面N条数据怎么遍历这件事情显然会非常耗费时间!
对于大表进行分页时可以使用一个技巧:根据主键进行分页。首先,查询表的主键,然后以主键为关键字进行查询,这样就可以利用索引,提高查询速度。
例如,查询id在1~5之间的记录,SQL语句可以写为:
SELECT * FROM student WHERE id BETWEEN 1 AND 5 ORDER BY id ASC;
利用此技巧,可以将分页查询速度提升到更高的级别
4. 总页数的计算
计算总页数需要查询数据库两次,一次查询数据总条数,另一次计算页数。
//查询总记录数
$countSql = "SELECT COUNT(*) FROM student";
$countResult = mysql_query($countSql, $conn);
$countRow = mysql_fetch_row($countResult);
$total = $countRow[0];
//计算总页数
$totalPages = ceil($total / PAGE_SIZE);
其中,ceil()
是PHP中的向上取整函数,计算总页数的时候需要先计算出总记录数,然后除以每页显示的数量即可。
三、总结
LIMIT分页是MySQL非常基础的操作之一,但是如果不熟练掌握会经常出错。需要注意保持结果集有序,对于大表的分页查询可以采用主键分页的技巧进行优化,同时计算总页数需要两次查询。以上是本次的MySQL LIMIT分页操作总结。