首页
归档
林与记站点维护动态记录
友链
Search
1
信息系统管理师资料汇总
16 阅读
2
经典易错题-电子商务设计师-软考中级-林与记
12 阅读
3
软考信息系统管理师全书要点整理
9 阅读
4
2024数据库管理工程师软考中级备考资料汇总
9 阅读
5
易混淆知识点-软考电子商务设计师资料
7 阅读
ᦗ 建站SEO
ഒ 考证资料
软考资料
建造师资料
DISCUZ建站
技术交流
娱乐灌水
登录
Search
标签搜索
软考资料免费下载
软考中级资料
软件设计师备考资料
信息安全工程师资料
一建资料
一级建造师考试资料
软考信管知识点
信息安全工程师备考必背知识点
linux运维
信息系统管理工程师资料
二建资料
oracle清理归档日志
seo
杏子yada
网站搭建
网站建设流程
如何搭建一个网站
jdk老版本下载
怎样下载jdk
mysql查询语句
Typecho
累计撰写
72
篇文章
累计收到
21
条评论
首页
栏目
ᦗ 建站SEO
ഒ 考证资料
软考资料
建造师资料
DISCUZ建站
技术交流
娱乐灌水
页面
归档
林与记站点维护动态记录
友链
搜索到
1
篇与
的结果
2023-08-08
mysql大数据量时的快速查询
有的小伙伴们工作中可能会接触到数据库的大数据量查询情况。本文也是我在网上看到的,觉得写挺好的,于是自己照着干了一下。发出来给大家看一下。现在我们查询一个三百万条的数据表:SELECT count(1) FROM message_log;三次查询时间为14060 ms、13755 ms、13447 ms普通分页查询MySQL 支持 LIMIT 语句来选取指定的条数数据, Oracle 可以使用 ROWNUM 来选取。MySQL分页查询语法如下:SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset第一个参数指定第一个返回记录行的偏移量第二个参数指定返回记录行的最大数目下面我们开始测试查询结果:SELECT * FROM message_log LIMIT 10000, 10查询3次时间分别为:59 ms49 ms50 ms这样看起来速度还行,不过是本地数据库,速度自然快点。换个角度来测试相同偏移量,不同数据量SELECT * FROM `message_log` LIMIT 10000, 10SELECT * FROM `message_log` LIMIT 10000, 100SELECT * FROM `message_log` LIMIT 10000, 1000SELECT * FROM `message_log` LIMIT 10000, 10000SELECT * FROM `message_log` LIMIT 10000, 100000SELECT * FROM `message_log` LIMIT 10000, 1000000从上面结果可以得出结束:数据量越大,花费时间越长相同数据量,不同偏移量SELECT * FROM `message_log` LIMIT 100, 100 SELECT * FROM `message_log` LIMIT 1000, 100 SELECT * FROM `message_log` LIMIT 10000, 100 SELECT * FROM `message_log` LIMIT 100000, 100 SELECT * FROM `message_log` LIMIT 1000000, 100 从上面结果可以得出结束:偏移量越大,花费时间越长SELECT * FROM `message_log` LIMIT 100, 100 SELECT id, attr FROM `message_log` LIMIT 100, 100如何优化既然我们经过上面一番的折腾,也得出了结论,针对上面两个问题:偏移大、数据量大,我们分别着手优化优化偏移量大问题采用子查询方式我们可以先定位偏移位置的 id,然后再查询数据SELECT * FROM `message_log` LIMIT 1000000, 10 SELECT id FROM `message_log` LIMIT 1000000, 1 SELECT * FROM `message_log` WHERE id >= ( SELECT id FROM `message_log` LIMIT 1000000, 1) LIMIT 10查询结果如下:从上面结果得出结论: 第一条花费的时间最大,第三条比第一条稍微好点 子查询使用索引速度更快 缺点:只适用于id递增的情况id非递增的情况可以使用以下写法,但这种缺点是分页查询只能放在子查询里面注意:某些 mysql 版本不支持在 in 子句中使用 limit,所以采用了多个嵌套selectSELECT * FROM `message_log` WHERE id IN ( SELECT t.id FROM ( SELECT id FROM `message_log` LIMIT 1000000, 10) AS t)采用 id 限定方式这种方法要求更高些,id必须是连续递增,而且还得计算id的范围,然后使用 between,sql如下SELECT * FROM `message_log` WHERE id between 1000000 AND 1000100 LIMIT 100 SELECT * FROM `message_log` WHERE id >= 1000000 LIMIT 100查询结果如下:从结果可以看出这种方式非常快注意:这里的 LIMIT 是限制了条数,没有采用偏移量优化数据量大问题返回结果的数据量也会直接影响速度SELECT * FROM `message_log` LIMIT 1, 1000000 SELECT id FROM `message_log` LIMIT 1, 1000000 SELECT id, user_id, ip, op_data, attr1, attr2, attr3, attr4, attr5, attr6, attr7, attr8, attr9, attr10, attr11, attr12 FROM `message_log` LIMIT 1, 1000000查询结果如下:从结果可以看出减少不需要的列,查询效率也可以得到明显提升第一条和第三条查询速度差不多,这时候你肯定会吐槽,那我还写那么多字段干啥呢,直接 * 不就完事了注意本人的 MySQL 服务器和客户端是在_同一台机器_上,所以查询数据相差不多,有条件的同学可以测测客户端与MySQL分开SELECT * 它不香吗?在这里顺便补充一下为什么要禁止 ‘SELECT *’ 。难道简单无脑,它不香吗?主要两点: 用 "SELECT * " 数据库需要解析更多的对象、字段、权限、属性等相关内容,在 SQL 语句复杂,硬解析较多的情况下,会对数据库造成沉重的负担。 增大网络开销,* 有时会误带上如log、IconMD5之类的无用且大文本字段,数据传输size会几何增涨。特别是MySQL和应用程序不在同一台机器,这种开销非常明显。
2023年08月08日
0 阅读
0 评论
0 点赞