分页查询方法:在MySQL中,分页查询一般是使用limit子句来实现的。limit子句声明如下:LIMIT子句可用于指定SELECT语句返回的记录数。注意以下几点:1.第一个参数指定第一个返回记录行的偏移量。2.第二个参数指定返回记录行的最大数量。3.如果只给一个参数:表示返回最大的记录行数为4,第二个参数为-1,表示检索从某一偏移量到记录集末尾的所有记录行.5、初始记录行的偏移量为0(而不是1)。下面是一个应用示例:该语句会查询表orders_history中第1000条数据之后的10条数据,即第1001条到第1010条数据。数据表中的记录默认按主键(通常是id)排序。以上结果等价于:3次查询时间分别为:3040ms3063ms3018ms对于这种查询方式,下面测试查询记录量对时间的影响:3次查询时间如下:查询1条记录:3072ms3092ms3002ms查询10条记录:3081ms3077ms3032ms查询100条记录:3118ms3200ms3128ms查询1000条记录:3412ms3468ms3394ms查询10000条记录:3749ms3802ms3696ms查询,从查询时间来看,比查询1000条记录的数量基本少了10条记录查询时间上基本没有差距。随着查询记录量的增加,花费的时间也会增加。查询偏移的测试:三个查询时间如下:查询100偏移:25ms24ms查询1000偏移:78ms76ms77ms查询10000偏移量:3092ms3212mms3212mm3128毫米查询100000偏移量:3878ms3812ms3798mms3798mms3798ms3798ms3798ms3798ms3798ms3798msoftseQUERY:146666662MSS14666622MSoffset增加,尤其是查询offset大于100000时,查询时间急剧增加。这种分页查询方式会从数据库中的第一条记录开始扫描,所以越往前查询速度越慢,查询的数据越多,也会拖慢总的查询速度。使用子查询优化,先定位到偏移位置的id,再向后查询。这种方法适用于id自增的情况。4条语句的查询时间如下:第1条语句:3674ms第2条语句:1315ms第3条语句:1327ms第4条语句:3710ms注意上面的查询:1.比较第1条语句和第2条语句语句:改用selectidselect*的速度提升了3倍2.对比第2条语句和第3条语句:速度相差几十毫秒3.对比第3条语句和第4条语句:受益于selectid速度的提升,查询速度第三个语句的增加了3倍。与原来通用的查询方式相比,这种方式会快数倍。使用id来限制和优化这个方法。假设数据表的id是不断增加的,我们可以根据查询的页数和查询的记录数来计算查询id的范围。和之间可以使用id来查询:查询时间:15ms12ms9ms的查询方式可以大大优化查询速度,基本可以在几十毫秒内完成。限制是只有明确知道id的情况下才能使用,但是一般在建表的时候都会加上一个基本的id字段,这给分页查询带来了很多方便。还有一种写法:当然也可以使用in方法查询。这种方式常用于多表关联时查询,使用其他表查询的id集合来查询:thisinquery注意:部分mysql版本不支持在in子句中使用limit。关于数据表的id一般情况下,在数据库中建表的时候,每张表都会强制加上一个id自增字段,方便我们查询数据。如果数据量很大,比如订单,一般建议分库分表。此时不推荐将id作为唯一标识,而应该使用分布式高并发唯一id生成器生成,并在数据表中使用另外一个字段来存储这个唯一标识。先用范围查询定位id(或index),再用index定位数据,即先selectid,再select*;这将提高数倍的查询速度。
