MySQL慢查询以及重构查询的方式记录
前言
什么是慢查询,如何优化慢查询,下面介绍这两个知识点的相关知识。
慢查询基础:优化数据访问
是否向数据库请求了不需要的数据
查询不需要的记录:解决方案:查询后面加上Limit
多表关联时返回全部列:解决方案:只取需要的列
总是取出全部列:select * 解决方案:最好还是获取部分列,除非应用程序处缓存列的数据了
重复查询相同的数据:解决方案:需要时从缓存中取出
MySQL是否在扫描额外的记录
可以从响应时间,扫描的行数,返回的行数来进行查询开销的衡量。
要想减少扫描行数可以使用索引对需要的记录进行覆盖,但是增加索引不意味着就能让扫描的行数等于返回的行数,比如sum,count之类的聚合函数
重构查询的方法
一个复杂查询还是多个简单查询
在过去,总是强调需要数据库层完成尽可能多的工作,因为过去网络通信查询解析和优化是一件代价很高的事情。
但是这样的想法对于MySQL并不适用,MySQL从设计上让连接和断开连接都很轻量级,在返回一个小的查询结果方面很高效。现代的网络速度比以前要快很多,无论是带宽还是延迟。在某些版本的MySQL上,即使在一个通用服务器上,也能够运行每秒超过10万的查询,即使是一个千兆网卡也能轻松满足每秒超过2000次的查询。所以运行多个小查询现在已经不是大问题了。
当然,相比较于内部扫描,响应数据给客户端更加耗时,所以在同条件下,使用尽可能少的查询更好。
切分查询
当使用sql进行查询时,需要注意将大查询切分成小查询,可以减少对数据库的影响,因为一个大语句一次性完成的话,则可能一次锁住很多数据,占满整个事务日志,耗尽系统资源,阻塞其他查询。
比如我们做数据统计时要对大量订单号的信息进行查询,那么是一次性用in查询,还是切割参数list多次查询呢,答案是切割参数list多次查询,因为当in里面的参数过多时,MySQL就会认为再走索引已经不行了,可能就会进行全表查询,如果这个时候数据表数据量过大,那可能就会造成查询超时。
// chops a list into non-view sublists of length L staticList > chopped(List
list, final int L) { List > parts = new ArrayList
>(); final int N = list.size(); for (int i = 0; i < N; i += L) { parts.add(new ArrayList
( list.subList(i, Math.min(N, i + L))) ); } return parts; } List numbers = Collections.unmodifiableList( Arrays.asList(5,3,1,2,9,5,0,7) ); List > parts = chopped(numbers, 3); System.out.println(parts); // prints "[[5, 3, 1], [2, 9, 5], [0, 7]]" parts.get(0).add(-1); System.out.println(parts); // prints "[[5, 3, 1, -1], [2, 9, 5], [0, 7]]" System.out.println(numbers); // prints "[5, 3, 1, 2, 9, 5, 0, 7]" (unmodified!)
您可能感兴趣的文章
- 05-31MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
- 05-31MySQL索引失效十种场景与优化方案
- 05-31MYSQL 高级文本查询之regexp_like和REGEXP详解
- 05-31MySQL获取binlog的开始时间和结束时间(最新方法)
- 05-31MySQL索引查询的具体使用
- 05-31基于MySQL和Redis扣减库存的实践
- 05-31关于MySQL的存储过程与存储函数
- 05-31MySQL实战文章(非常全的基础入门类教程)
- 05-31MySQL Flink Watermark实现事件时间处理的关键技术
- 05-31MySQL Flink实时流处理的核心技术之窗口机制
阅读排行
推荐教程
- 05-30Navicat for MySQL 11注册码激活码汇总
- 05-27Mysql误删数据快速恢复
- 05-31VS2022连接数据库MySQL并进行基本的表的操作指南
- 05-30解决seata不能使用mysql8版本的问题方法
- 05-30MYSQL字符集设置的方法详解(终端的字符集)
- 05-30解决MySQL启动报错:ERROR 2003 (HY000): Can't con
- 05-30关于Mysql-connector-java驱动版本问题总结
- 11-22mac下安装mysql忘记密码的修改方法
- 05-30MySQL中的隐藏列的具体查看
- 11-22mysql exists与not exists实例详解