浅谈关于SQL优化的思路
零、为什么要优化
- 系统的吞吐量瓶颈往往出现在数据库的访问速度上
- 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢
数据是存放在磁盘上的,读写速度无法和内存相比
一、观察
MySQL优化≠SQL语句优化,理解这一点非常重要,虽然大部分时候我们都在调优SQL语句。
然而,MySQL的优化却是始于观察,而且有时候观察几分钟,几小时就能得出结论的,可能要观察一天以上。
这么做的目的很明显,就是为了帮助我们定位问题所在。
比如:MySQL的负载会在固定的某个时间节点突然暴涨,或者一请求某几个页面就产生了较为明显的延迟,甚至影响了随后的各个请求等。
观察的手段有多种多样,阿里云有强大的RDS控制台,也可以自建一套监控平台,最次的就是临时跑个shell脚本,收集MySQL运行状况。
观察的指标也不尽相同,最知名的 show status 命令列出的指标就能不下200个,所以观察也要有所取舍。
经常受人关注的指标有当前连接数以及最大连接数,当前运行的线程数,慢查询数量等。
二、分析
将观察的结果做进一步分析,也就形成了不同的解决思路。
可能是某个时间节点缓存失效,导致MySQL的负载激增,可以设法将缓存失效的时间节点尽可能均匀的分摊在一天24小时中,或者找个访问量较少的时段刷新缓存。
可能是SQL语句存在潜在问题,在某些情况下会有性能问题,可以用 show full processlist 定位是哪个库,也可以开启慢查询,直接定位到有问题的SQL语句,使用explain分析语句执行计划。可能加个索引能解决问题,也有可能join太多表,需要拆分查询,也有可能单表体量过大,要拆表了。
可能是机器本身性能问题,所谓“巧妇难为无米之炊”,这个时候要考虑扩容了。
三、解决
在分析阶段已经提及了大部分解决手段了,最后总结一下:
1、引入缓存,当然,这是一把双刃剑,要想用的恰如其分,还是需要一定的功力。缓存也分两方面的,一方面是MySQL的内部缓存机制,MySQL提供了多种缓存参数的配置,比如查询的结果集缓存,结果集排序的缓存,可根据实际情况进行调整。另一方面是MySQL之外的缓存,比如Redis+MySQL的架构,开启了Hibernate(Mybatis)的缓存功能。缓存的引入无非是想减轻MySQL的查询负担,但是必须在性能稳定性与数据时效性之间取得平衡。
2、SQL语句有性能问题,这种情况时有发生,通常是上线之前未能做一个完整的基准测试,而只是简单的功能性测试。当数据量积累到一定程度之后,SQL性能问题就集中爆发出来了。所以,在写完SQL之后,要养成explain的习惯,将潜在的性能问题扼杀在萌芽中。当然,我们也要避免“过度优化”,我们要预见得到一张表是读取次数多,还是更新次数多,数据量会不会爆发性增长,还是增长十分缓慢。当然,写SQL语句也要遵循一定的原则,比如什么时候用IN查询,什么时候用EXISTS谓词,在JOIN之前是不是可以精简一部分表数据,建立的索引能否正确派上用场……
3、必要的时候,可以对机器进行扩容,当然系统的整体架构也可以考虑进行优化,搭建MySQL集群,可靠性和可用性都能得到大幅提升。
四、补充:SQL范式
1NF
每一个分量必须是不可分的数据项。
特点:
- 有主键,且主键不能为空。
- 字段不能再分。
2NF
在范式一的基础上,且每一个非主属性完全函数依赖于码。
特点:
- 满足第一范式。
- 表中的每一个非主属性,必须完全依赖于本表码。
- 只有当一个表中,主码由两个或以上的属性组成的时候,才会出现不符合第二范式的情况。
3NF
在满足第二范式的基础上,且每一个非主属性既不部分依赖于码也不传递依赖于码。
特点:
- 满足第二范式。
- 非主属性不能传递依赖于码。
** BCNF**
在满足第三范式的基础上,且不允许主键的一部分被另一部分或其它部分决定。
特点:
- 满足第三范式。
- 所有非主属性对每一个码都是完全函数依赖。
- 所有的主属性对每一个不包含它的码,也是完全函数依赖。
- 没有任何属性完全函数依赖于飞码的任何一组属性。
以上是对MySQL优化的框架性思考。
浅谈关于SQL优化的思路的更多相关文章
- 浅谈mysql配置优化和sql语句优化【转】
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- SQL优化的思路及基本原则(mysql)
SQL优化的思路: 1.优化更需要优化的sql: 2.定位优化对象的性能瓶颈:优化前需了解查询的瓶颈是IO还是CPU,可通过PROFILING很容易定位查询的瓶颈. 3.明确优化目标: 4.从 ...
- 霜皮剥落紫龙鳞,下里巴人再谈数据库SQL优化,索引(一级/二级/聚簇/非聚簇)原理
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_206 举凡后端面试,面试官不言数据库则已,言则必称SQL优化,说起SQL优化,网络上各种"指南"和" ...
- 浅谈MySQL中优化sql语句查询常用的30种方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...
- Mysql 性能优化7【重要】sql语句的优化 浅谈MySQL中优化sql语句查询常用的30种方法(转)
原文链接 http://www.jb51.net/article/39221.htm 这篇文章大家都在转载,估计写的有条理吧,本人稍微做一下补充 1.对查询进行优化,应尽量避免全表扫描,首先应考虑 ...
- 浅谈 MySQL 中优化 SQL 语句查询常用的 30 种方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...
- (转)运维角度浅谈MySQL数据库优化
转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...
- 运维角度浅谈MySQL数据库优化(转)
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
随机推荐
- Spring MVC 向页面传值-Map、Model和ModelMap https://www.cnblogs.com/caoyc/p/5635878.html
Spring MVC 向页面传值-Map.Model和ModelMap 除了使用ModelAndView方式外.还可以使用Map.Model和ModelMap来向前台页面创造 使用后面3种方式,都是在 ...
- fiddler之简单的接口性能测试
在针对某一个/某一些接口,发送相同的请求,不考虑参数的变化时,可以使用fiddler进行简单的性能测试.(使用功能为:replay) 一.replay功能调用 (1.Reissue Requests: ...
- 005/搭建fabric环境(一)
一.安装虚拟机VMware 参考博客:https://blog.csdn.net/u013142781/article/details/50529030 Step1:下载ubuntu镜像 (约1.8G ...
- AI会议网站
<麻省理工科技评论>新兴科技峰会EmTech China : http://www.emtechchina.cn/ IT大咖说 各种科技前沿会议发布站 : http://www.itdks ...
- [Markdown] 03 进阶语法 第一弹
目录 1. YMAL 题头 2. 缩写 3. 强调 4. 自定义 <div> 标签 5. <cite> 标签 5. <code> 与 <br> 标签 6 ...
- JVM-堆内存
1. java堆内存介绍 java的堆内存可以类比于计算机的内存,是存储整个机器数据的地方. (1)jvm一起动就创建java堆.类比计算机一起动就加载内存. (2)所有的线程共享.类比计算机所有进程 ...
- [2019杭电多校第七场][hdu6655]Just Repeat
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6655 题意是说两个人都有一些带有颜色的牌,两人轮流出牌,但是不能出对面出过的颜色的牌,最后谁不能出牌谁 ...
- P1455 搭配购买 (并查集+01背包)
[题目描述] 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵 ...
- http的Content-Encoding和Content-Type及服务器和客户端处理流程
比如,A 给 B发送了一条信息:hello,首先,A要告诉B,我给你发的这条数据的类型,不同类型的数据,接收方的处理方式不一样,hello属于文本类型,所以Content-Type就要设置成 text ...
- vue访问外部接口设置代理,解决跨域(vue-cli3.0)
vue-cli3.0搭建的项目,平时访问内部接口配置了拦截器,今天需要调用天气预报的外部接口,发现跨域问题,通过配置代理解决. 1.在vue.config.js中配置代理 module.exports ...