文章插图
前言当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询 。对于数据库分页查询,也有很多种方法和优化的点 。下面简单说一下我知道的一些方法 。
准备工作
为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明 。
表名:order_history描述:某个业务的订单历史表主要字段:unsigned int id,tinyint(4) int type字段情况:该表一共37个字段,不包含text等大型数据,最大为varchar(500),id字段为索引,且为递增 。数据量:5709294MySQL版本:5.7.16线下找一张百万级的测试表可不容易,如果需要自己测试的话,可以写shell脚本什么的插入数据进行测试 。
以下的 sql 所有语句执行的环境没有发生改变,下面是基本测试结果:
select count(*) from orders_history;返回结果:5709294
三次查询时间分别为:
8903 ms8323 ms8401 ms
一般分页查询
一般的分页查询使用简单的 limit 子句就可以实现 。limit 子句声明如下:
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offsetLIMIT 子句可以被用于指定 SELECT 语句返回的记录数 。需注意以下几点:
第一个参数指定第一个返回记录行的偏移量第二个参数指定返回记录行的最大数目如果只给定一个参数:它表示返回最大的记录行数目第二个参数为 -1 表示检索从某一个偏移量到记录集的结束所有的记录行初始记录行的偏移量是 0(而不是 1)下面是一个应用实例:
select * from orders_history where type=8 limit 1000,10;该条语句将会从表 orders_history 中查询第1000条数据之后的10条数据,也就是第1001条到第10010条数据 。
数据表中的记录默认使用主键(一般为id)排序,上面的结果相当于:
select * from orders_history where type=8 order by id limit 10000,10;三次查询时间分别为:
3040 ms3063 ms3018 ms
针对这种查询方式,下面测试查询记录量对时间的影响:
select * from orders_history where type=8 limit 10000,1;select * from orders_history where type=8 limit 10000,10;select * from orders_history where type=8 limit 10000,100;select * from orders_history where type=8 limit 10000,1000;select * from orders_history where type=8 limit 10000,10000;三次查询时间如下:
查询1条记录:3072ms 3092ms 3002ms查询10条记录:3081ms 3077ms 3032ms查询100条记录:3118ms 3200ms 3128ms查询1000条记录:3412ms 3468ms 3394ms查询10000条记录:3749ms 3802ms 3696ms
另外我还做了十来次查询,从查询时间来看,基本可以确定,在查询记录量低于100时,查询时间基本没有差距,随着查询记录量越来越大,所花费的时间也会越来越多 。
针对查询偏移量的测试:
select * from orders_history where type=8 limit 100,100;select * from orders_history where type=8 limit 1000,100;select * from orders_history where type=8 limit 10000,100;select * from orders_history where type=8 limit 100000,100;select * from orders_history where type=8 limit 1000000,100;三次查询时间如下:
查询100偏移:25ms 24ms 24ms查询1000偏移:78ms 76ms 77ms查询10000偏移:3092ms 3212ms 3128ms查询100000偏移:3878ms 3812ms 3798ms查询1000000偏移:14608ms 14062ms 14700ms
随着查询偏移的增大,尤其查询偏移大于10万以后,查询时间急剧增加 。
这种分页查询方式会从数据库第一条记录开始扫描,所以越往后,查询速度越慢,而且查询的数据越多,也会拖慢总查询速度 。
使用子查询优化
这种方式先定位偏移位置的 id,然后往后查询,这种方式适用于 id 递增的情况 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- 35岁后的职业规划 35岁以后职业生涯规划坚持两大原则,轻松实现自我超越
- php用递归求n的阶乘 php中n阶乘的实现方法
- php垃圾收集机制怎么样的 php引用计数如何实现垃圾回收
- php断点调试 php方法断点如何实现
- 好兄弟合作开店18年,600平方米的花艺生活空间实现梦想
- 上班族的“花园梦”就实现了:阳台种1盆木香花
- php 上传文件 php实现文件的上传和下载
- mysql可视化管理工具 java连接mysql的jar包没有bin
- 安装laravel框架的命令 php laravel框架自带命令的实现
- 社会越趋于稳定,实现阶层跳跃就越困难,我们何以为生?