关于分页这个的话在网上找了不少资料,自己也动手测试过了!以一个4000W的随机数据表来作为测试原型!
字段有:序号(默认id自动递增)、手机号(double浮点型)、QQ号(double浮点型)、名字(varchar字节型俗称文本型)、余额(double浮点型)、最后消费时间(datetime日期时间型)、注册时间(datetime日期时间型)。测试表除了默认主键序号是索引外(主键自带不用自己加),无其他的索引。
随着我们开始投用数据库之后,数量是随着时间的增加而增加,前期的数量小的时候我们是感觉不出来会有什么样的性能差异,基本上都是毫秒级的响应(本地数据库、网络数据库看舍不舍得用钱砸),可是数据量到了10万,百万至千万,他的性能还能那么高吗?一点小小的失误,可能造成整个系统的改写,甚至更本系统无法正常运行!废话不多说了,直接上干货吧!下面是测试环境:数据库安装在固态硬盘上!测试表引擎:InnoDB
电脑型号 X64 兼容 台式电脑
操作系统 Windows 10 专业版 64位 ( DirectX 12 )
处理器 AMD Ryzen Threadripper 2920X 12-Core
主板 华硕 ROG STRIX X399-E GAMING ( AMD PCI 标准主机 CPU 桥 )
内存 32 GB ( 金士顿 DDR4 3200MHz )
主硬盘 浦科特 PX-512M9PeGN ( 512 GB 固态硬盘 )
显卡 Nvidia GeForce GTX 1660 Ti ( 6 GB / 技嘉 )
以下的字段名代表的是这些字段:序号,手机号,QQ号码,名字,余额,消费时间,注册时间。这样也是为了节省空间!
我为了方便0我就不打那么多了!直接用W来代替!大家要使用的时候可不能用W哦,mysql不认识这个!
下面这个是常规的分页读取测试数据:
select 字段名 from 表名 limit 1000,10; 响应时间是:0.06秒
select 字段名 from 表名 limit 9W,10; 响应时间是:0.16秒
select 字段名 from 表名 limit 90W,10; 响应时间是:0.70秒
select 字段名 from 表名 limit 900W,10; 响应时间是:7.42秒
select 字段名 from 表名 limit 1800W,10; 响应时间是:12.41秒
select 字段名 from 表名 limit 3600W,10; 响应时间是:20.44秒
select 字段名 from 表名 limit 40019990,10; 响应时间是:17.02秒
其实说如果是序号连续的话我们可以使用关键字in这个来读取也是很快的,前提是序号连续的!
select 字段名 from 表名 where 序号 in (40012000,40012001,400120000,40012002,40012005); 响应时间是:0.03秒
看样子这个in读取数据是比上面的快了很多倍,但是前提是你要知道你下一页的那10条数据的序号都是什么来的。好了我们接着测试。
有些数据库是导入进来或者什么的,序号可能会很乱所以加了个排序上去。
select 字段名 from 表名 where 序号>=(select 序号 from 表名 order by 序号 limit 1000,1) limit 10;响应时间是:0.06秒
select 字段名 from 表名 where 序号>=(select 序号 from 表名 order by 序号 limit 9W,1) limit 10;响应时间是:0.08秒
select 字段名 from 表名 where 序号>=(select 序号 from 表名 order by 序号 limit 90W,1) limit 10;响应时间是:0.24秒
select 字段名 from 表名 where 序号>=(select 序号 from 表名 order by 序号 limit 900W,1) limit 10;响应时间是:2.01秒
select 字段名 from 表名 where 序号>=(select 序号 from 表名 order by 序号 limit 1800W,1) limit 10;响应时间是:3.76秒
select 字段名 from 表名 where 序号>=(select 序号 from 表名 order by 序号 limit 3600W,1) limit 10;响应时间是:7.85秒
select 字段名 from 表名 where 序号>=(select 序号 from 表名 order by 序号 limit 40019990,1) limit 10;响应时间是:9.68秒
从测试数据来看的话第二种方法的话确实比第一种方法的速度快了很多倍。下面我们在来测试第三种方法:
select 字段名 from 表名 where 序号>=1000 order by 序号 LIMIT 10;响应时间是:0.04秒
select 字段名 from 表名 where 序号>=9W order by 序号 LIMIT 10;响应时间是:0.06秒
select 字段名 from 表名 where 序号>=90W order by 序号 LIMIT 10;响应时间是:0.07秒
select 字段名 from 表名 where 序号>=900W order by 序号 LIMIT 10;响应时间是:0.07秒
select 字段名 from 表名 where 序号>=1800W order by 序号 LIMIT 10;响应时间是:0.06秒
select 字段名 from 表名 where 序号>=3600W order by 序号 LIMIT 10;响应时间是:0.06秒
select 字段名 from 表名 where 序号>=40019990 order by 序号 LIMIT 10;响应时间是:0.07秒
相对来说的话第三种方法的话速度比前面两种方法快了几十倍上百倍。这个也只是针对于我们读取数据出来的一个分页,如果在加上条件的个人建议还是加上索引,加上条件没有索引的话速度就会慢了很多!在网上找资料的时候也看到过一篇文章说每张表的数据最好不超过500W,也就是说500W以下一张表的话性能是最好的!超过数量的话就直接分表!或者在设计的时候就直接分好表,等第一张表快到500W的时候就切换到下一张表来添加数据!土豪可以忽略!以上的看法仅仅代表个人的看法和个人的测试数据!仅供参考,如有不对的或者有更好的想法的可以给我留言!

本文分享自微信公众号 - 易语言mysql新手,如有侵权,请联系 service001@enmotech.com 删除。




