select * from user limit 0, 10;
select * from user limit 10, 10;offset = (pagenum - 1) * pagesize;
由于数据量过大,如果不加入分页的话就会一次性将所有数据取出来,非常耗费时间,而使用分页就可以很好地解决这个问题
mysql是通过limit来进行分页控制的
select * from (表) limit 0,10;
limit第一个参数就是从哪里开始读,第二个参数是一次读几页
当数据量小时通过limit实现分页查询,当数据量大时就会通过索引或建立主键来进行更快捷的查询。
得分点
LIMIT
参考答案
标准回答
不同的数据库实现分页的方式是不同的,下面我们以MySQL为例来说明如何分页。在MySQL中,分页是通过LIMIT子句实现的,LIMIT的语法如下。总之,带有一个值的LIMIT总是从第一行开始,返回指定的行数。带两个值的LIMIT可以从指定行号处开始,返回指定的行数。
加分回答
在偏移量非常大的时候,例如
LIMIT 10000,20
这样的查询,这时MySQL需要查询10020条记录然后只返回最后20条,前面的10000条记录都将被抛弃,这样的代价是非常高的。要优化这种查询,要么是在页面中限制分页的数量,要么是优化大偏移量的性能。 优化此类分页查询的一个最简单的办法就是尽可能地使用索引覆盖扫描,而不是查询所有的列,然后根据需要做一次关联操作再返回所需的列。对于偏移量很大的时候,这样做的效率会提升非常大。考虑下面的查询:
如果这个表非常大,那么这个查询最好改写成下面的样子:
这里的“延迟关联”将大大提升查询效率,它让MySQL扫描尽可能少的页面,获取需要访问的记录后再根据关联列回原表查询需要的所有列。这个技术也可以用于优化关联查询中的LIMIT子句。
有时候也可以将LIMIT查询转换为已知位置的查询,让MySQL通过范围扫描获得对应的结果。例如,如果在一个位置列上有索引,并且预先计算出了边界值,上面的查询就可以改写为:
对数据进行排名的问题也与此类似,但往往还会同时和GROUP BY混合使用,在这种情况下通常都需要预先计算并存储排名信息。
LIMIT和OFFSET的问题,其实是OFFSET的问题,它会导致MySQL扫描大量不需要的行然后再抛弃掉。如果可以使用书签记录上次取数的位置,那么下次就可以直接从该书签记录的位置开始扫描,这样就可以避免使用OFFSET。例如,若需要按照租赁记录做翻页,那么可以根据最新一条租赁记录向后追溯,这种做法可行是因为租赁记录的主键是单调增长的。首先使用下面的查询获得第一组结果:
假设上面的查询返回的是主键16049到16030的租赁记录,那么下一页查询就可以从16030这个点开始:
该技术的好处是无论翻页到多么后面,其性能都会很好。
答案出处
《高性能MySQL:第三版》,特卡琴科,6.7