MySQL 优化实战记录
阅读本文大概需要 2 分钟。
背景
本次SQL优化是针对javaweb中的表格查询做的。
部分网络架构图
业务简单说明
N个机台将业务数据发送至服务器,服务器程序将数据入库至MySQL数据库。服务器中的javaweb程序将数据展示到网页上供用户查看。
原数据库设计
1、windows单机主从分离
2、已分表分库,按年分库,按天分表
3、每张表大概20w左右的数据
原查询效率
3天数据查询70-80s
目标
3-5s
业务缺陷
无法使用sql分页,只能用java做分页。
问题排查
前台慢 or 后台慢
1、如果你配置了druid,可在druid页面中直接查看sql执行时间和uri请求时间
2、在后台代码中用System.currentTimeMillis计算时间差。
结论 : 后台慢,且查询sql慢
sql有什么问题
1、sql拼接过长,达到了3000行,有的甚至到8000行,大多都是union all的操作,且有不必要的嵌套查询和查询了不必要的字段
2、利用explain查看执行计划,where条件中除时间外只有一个字段用到了索引
备注 : 因优化完了,之前的sql实在找不到了,这里只能YY了。
查询优化
去除不必要的字段
效果没那么明显
去除不必要的嵌套查询
效果没那么明显
分解sql
将union all的操作分解,例如(一个union all的sql也很长)
将如上sql分解成若干个sql去执行,最终汇总数据,最后快了20s左右。
将分解的sql异步执行
利用java异步编程的操作,将分解的sql异步执行并最终汇总数据。这里用到了CountDownLatch和ExecutorService,示例代码如下:
结果又快了20-30s
优化MySQL配置
以下是我的配置示例。加了skip-name-resolve,快了4-5s。其他配置自行断定
根据业务,再加上筛选条件
快4-5s
将where条件中除时间条件外的字段建立联合索引
效果没那么明显
将where条件中索引条件使用inner join的方式去关联
针对这条,我自身觉得很诧异。原sql,b为索引
应该之前有union all,union all是一个一个的执行,最后汇总的结果。修改为
结果快了3-4s
性能瓶颈
根据以上操作,3天查询效率已经达到了8s左右,再也快不了了。查看mysql的cpu使用率和内存使用率都不高,到底为什么查这么慢了,3天最多才60w数据,关联的也都是一些字典表,不至于如此。继续根据网上提供的资料,一系列骚操作,基本没用,没辙。
环境对比
因分析过sql优化已经ok了,试想是不是磁盘读写问题。将优化过的程序,分别部署于不同的现场环境。一个有ssd,一个没有ssd。发现查询效率悬殊。用软件检测过发现ssd读写速度在700-800M/s,普通机械硬盘读写在70-80M/s。
优化结果及结论
优化结果:达到预期。
优化结论:sql优化不仅仅是对sql本身的优化,还取决于本身硬件条件,其他应用的影响,外加自身代码的优化。
小结
优化的过程是自身的一个历练和考验,珍惜这种机会,不做只写业务代码的程序员。希望以上可以有助于你的思考,不足之处望指正。
原文链接:
https://my.oschina.net/xiaozhutefannao/blog/2243432
·END·
程序员的成长之路
路虽远,行则必至
微信ID:cxydczzl
往期精彩回顾
MySQL 优化实战记录的更多相关文章
- 使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录
使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从 4.1开始支持SQL的子查询.这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查 ...
- Java 性能优化实战记录(3)--JVM OOM的分析和原因追查
前言: C/C++的程序员渴望Java的自由, Java程序员期许C/C++的约束. 其实那里都是围城, 外面的人想进来, 里面的人想出去. 背景: 作为Java程序员, 除了享受垃圾回收机制带来的便 ...
- Java 性能优化实战记录(2)---句柄泄漏和监控
前言: Java不存在内存泄漏, 但存在过期引用以及资源泄漏. (个人看法, 请大牛指正) 这边对文件句柄泄漏的场景进行下模拟, 并对此做下简单的分析.如下代码为模拟一个服务进程, 忽略了句柄关闭, ...
- Java 性能优化实战记录(1)---定位并分析耗cpu最多的线程
1) jps 列出相关的java进程, 以及对应的pid 也可以使用如下命令来尝试 ps aux | grep java --color 2) top -Hp <pid> ...
- 8.2.1.2 How MySQL Optimizes WHERE Clauses MySQL 优化WHERE 子句
8.2.1.2 How MySQL Optimizes WHERE Clauses MySQL 优化WHERE 子句 本节讨论优化用于处理WHERE子句, 例子是使用SELECT 语句,但是相同的优化 ...
- Linux记录-史上最全的MySQL高性能优化实战总结(转载)
史上最全的MySQL高性能优化实战总结! 1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优 ...
- 知识点:Mysql 索引优化实战(3)
知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 索引原理知识回顾 索引的性 ...
- MySQL——索引优化实战
上篇文章中介绍了索引的基本内容,这篇文章我们继续介绍索引优化实战.在介绍索引优化实战之前,首先要介绍两个与索引相关的重要概念,这两个概念对于索引优化至关重要. 本篇文章用于测试的user表结构: 索引 ...
- 史上最全的MySQL高性能优化实战总结!
1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多 ...
随机推荐
- Mac 怎么通过自带终端连接linux服务器
简单来说,就两步骤 · 打开Mac终端,切换到root权限下 切换root权限: sudo -i ·通过ssh命令连接linux服务器 ssh root@127.0.0.1 root是账户名,@后面的 ...
- [Hbase]Hbase章4 Hbase分区爆了
又搞事了,发生了啥事呢:生产分区数暴了,What? 目前的情况: 前提:单Region Server分区上限设置为1000: 目前A表的数据量半年达到25E,20G一分区,达到了900多个分区,这是要 ...
- delphi中 panel如何在Form实现鼠标移动拖放
Panel的MouseDown事件 移动就写上ReleaseCapture;SendMessage(Panel1.Handle,wm_SysCommand,$F012,0); 改变大小就写上Relea ...
- 老赵点滴地址:http://blog.zhaojie.me/2009/05/a-simple-actor-model-implementation.html
老赵点滴地址:http://blog.zhaojie.me/2009/05/a-simple-actor-model-implementation.html
- angularJs 2-quickstart学习记录
angular官网文档 我尝试文档中下载<快速起步>种子的方法进行quickstart. cd quickstart npm install npm start npm install 这 ...
- python中os.path 与sys.path
看别人写的代码,会发现两个和路径设置有关的模块 os 和sys.我对这两个模块也不是特别了解.只是记录一下自己看到的,学到的. python 中我们会使用这两个模块和文件路径, 创建文件 之类的 操作 ...
- 高速上手C++11 14 笔记2
lambda表达式和std function bind 两者配合构成了函数新的使用方法. 智能指针 sharedptr, uniqueptr, weak_ptr auto pointer = std: ...
- 采用Google预训bert实现中文NER任务
本博文介绍用Google pre-training的bert(Bidirectional Encoder Representational from Transformers)做中文NER(Name ...
- 卸载HDP大数据平台
使用以下说明卸载HDP: 停止所有已安装的HDP服务.请参阅HDP参考指南中的停止HDP服务. 如果安装了Knox,请在所有群集节点上运行以下命令: 对于RHEL / CentOS / Oracle ...
- 前台js接收后台的json数据
后台返回的json数据,如php的: return json_encode($data); 在前台 js接收如下: function json2object(str){ var jsstr = str ...