数据库面试:分页查询的SQL写法

版权声明:本文为博主原创文章,转载敬请作出引用声明方便相互交流学习! https://blog.csdn.net/sweeper_freedoman/article/details/82054851

    分页是很多网站应用或管理系统比较常见的需要实现的需求,是相关开发同学常碰到的需要写的查询。开发面试中会不会被问到用SQL写分页,因为个人不是开发,就不得而知了。在之前自己参加的数据库岗位的面试中,被问到用SQL写分页,所以这里记录一下。

SELECT t.`columnA`, t.`columnB`, t.`columnC`
FROM `table` AS t
ORDER BY t.`column` /* usually primary key or timestamp key column */ DESC
LIMIT {page_row} /* rows per page */
OFFSET {page_off} /* offsets per page := {page_row} * ({page_num} - 1) */
;

    一句很简单的SELECT查询。实际应用中比较常见的需求是按照时间顺序由最近开始往前查询然后分页,所以一般是以一个时间戳`column`来DESC降序ORDER BY。LIMIT后面的{page_row}是每页包含多少条记录,这个一般是个固定大小的参数,由外部传入。OFFSET后面的{page_off}是查询时每页的偏移量,可以简单地通过页记录数{page_row}和页号码{page_num}递推出来:{page_row} * ({page_num} - 1)。

    其实作为数据库岗位来说,更多的工作是放在该查询的性能方面,最主要的是查询中的ORDER BY字段有索引可用。如果需要返回的字段较少而且可控,可以考虑将排序字段和返回字段建一个组合索引,这样只查询索引页,节省潜在的磁盘I/O和内存占用。在InnoDB存储引擎中,由于是索引组织表,即记录的写入本身就是以其插入的次序先后排序的,所以主键字段可以扮演时间戳字段用以排序的角色。因此,如果不存在数据断裂(记录行有被物理删除或者逻辑删除过),根据实际情况也可以取用主键字段代替时间戳字段来作为分页的排序依据。

猜你喜欢

转载自blog.csdn.net/sweeper_freedoman/article/details/82054851
今日推荐