第一篇:MySQL 调优从入门到放弃?不!看完这篇你也能成为 “数据库老中医“
前言:为什么你的 MySQL 总是 "生病"?
作为一名后端开发,你是否有过这样的经历:
凌晨三点,老板一个夺命连环 call 把你从美梦中惊醒:"小王!服务器崩了!用户都在投诉!" 你睡眼惺忪地打开电脑,排查了一圈,发现罪魁祸首是一条执行了 10 秒的 SQL 语句。 你对着这条 SQL 看了半天,挠破了头也不知道为什么这么慢。 最后只能无奈地重启数据库,心里默默祈祷:"下次别再出问题了..."
如果你也有过这样的经历,那么恭喜你,你需要学习 MySQL 调优了!
很多人一听到 "调优" 两个字就头大,觉得这是 DBA 的专属技能,高深莫测。其实不然,MySQL 调优就像中医看病一样,只要掌握了 "望闻问切" 的基本方法,你也能成为一名合格的 "数据库老中医"。
今天这篇文章,我就用最通俗易懂的语言,带你走进 MySQL 调优的世界,让你从此告别 "凌晨三点被叫醒" 的噩梦!
一、望:先看看你的数据库 "气色" 怎么样
中医看病第一步是 "望",观察病人的气色。MySQL 调优也是一样,我们首先要了解数据库的运行状态。
1.1 查看数据库的基本信息
首先,我们来看看数据库的 "基本体检报告":
这些信息就像病人的体温、血压、心率一样,能让我们对数据库的健康状况有一个初步的了解。
1.2 找出 "害群之马":慢查询日志
一个健康的数据库,大部分查询都应该在毫秒级完成。如果有一些查询执行时间特别长,就会像 "害群之马" 一样拖慢整个数据库的性能。
这时候,慢查询日志就是我们最好的工具。它会记录所有执行时间超过指定阈值的 SQL 语句,让我们能够精准定位问题。
开启慢查询日志的方法很简单:
开启慢查询日志后,所有执行时间超过 2 秒的 SQL 语句都会被记录下来。接下来,我们就可以针对这些慢查询进行优化了。
二、闻:听听数据库的 "心跳"
中医看病第二步是 "闻",听病人的呼吸和心跳。MySQL 调优也是一样,我们需要了解数据库的运行情况,听听它的 "心跳"。
2.1 使用 EXPLAIN 分析执行计划
当我们找到一条慢查询后,最常用的分析工具就是 EXPLAIN。它可以告诉我们 MySQL 是如何执行这条 SQL 语句的,包括使用了哪些索引、表的连接顺序、扫描了多少行数据等等。
使用方法非常简单,只需要在 SQL 语句前面加上 EXPLAIN 关键字:
EXPLAIN 的输出结果有很多列,其中最重要的几列是:
-
id:查询的序列号
-
select_type:查询的类型(简单查询、子查询、联合查询等)
-
table:表名
-
type:访问类型(这是最重要的一列,从好到坏依次是:system > const > eq_ref > ref > range > index > ALL)
-
key:实际使用的索引
-
rows:扫描的行数
-
Extra:额外信息(比如是否使用了索引、是否需要排序等)
举个例子,如果 type 列显示的是 "ALL",那就意味着 MySQL 正在进行全表扫描,这是性能最差的情况,必须优化!
2.2 理解索引:数据库的 "目录"
很多人对索引的理解停留在 "索引能加快查询速度" 这个层面,但其实索引的原理非常简单。
你可以把数据库表想象成一本厚厚的字典,而索引就是字典的目录。如果没有目录,你要找一个字就需要从头翻到尾(全表扫描);有了目录,你只需要看目录就能快速找到这个字所在的页码(索引查找)。
MySQL 中最常用的索引类型是 B + 树索引。B + 树是一种平衡多路查找树,它的特点是所有数据都存储在叶子节点上,并且叶子节点之间通过指针连接,非常适合范围查询。
创建索引的语法也很简单:
三、问:问问数据库 "哪里不舒服"
中医看病第三步是 "问",询问病人的症状。MySQL 调优也是一样,我们需要通过一些命令来询问数据库的运行情况,找出问题所在。
3.1 查看表的信息
首先,我们来看看表的基本信息:
如果一个表的数据量特别大,或者索引大小超过了数据大小,那可能就需要优化了。
3.2 常见的 SQL"坏习惯"
很多时候,慢查询并不是因为数据库本身的问题,而是因为我们写的 SQL 语句有问题。下面我列举一些常见的 SQL"坏习惯",看看你中了几个:
-
\\SELECT \\\:永远不要使用 SELECT \,只查询你需要的列
-
在索引列上使用函数或运算:这会导致索引失效,比如
WHERE YEAR(create_time) = 2023 -
使用 LIKE '% xxx%':前导通配符会导致索引失效
-
使用 OR 连接条件:如果 OR 两边的条件有一个没有索引,就会导致全表扫描
-
使用 IN 子查询:IN 子查询的性能通常很差,建议使用 JOIN 代替
-
没有 LIMIT 限制:如果查询结果可能有很多行,一定要加上 LIMIT 限制
四、切:给数据库 "把脉",对症下药
中医看病最后一步是 "切",给病人把脉,然后对症下药。MySQL 调优也是一样,我们需要根据前面的分析结果,采取相应的优化措施。
4.1 索引优化:最有效的调优手段
索引优化是 MySQL 调优中最基础也是最有效的手段。据统计,80% 以上的慢查询都可以通过添加合适的索引来解决。
但是,索引并不是越多越好。过多的索引会增加插入、更新和删除操作的开销,因为每次修改数据都需要更新索引。
那么,我们应该如何创建合适的索引呢?这里有几个基本原则:
-
为经常出现在 WHERE 子句中的列创建索引
-
为经常出现在 ORDER BY 和 GROUP BY 子句中的列创建索引
-
为经常出现在 JOIN 条件中的列创建索引
-
联合索引要遵循 "最左前缀原则"
-
不要为区分度低的列创建索引(比如性别列,只有男和女两个值)
4.2 SQL 语句优化
除了添加索引,我们还可以通过优化 SQL 语句来提高性能。下面我举几个常见的例子:
例子 1:使用 JOIN 代替子查询
例子 2:避免在索引列上使用函数
例子 3:使用 LIMIT 限制结果集
4.3 配置文件优化
除了索引和 SQL 语句优化,我们还可以通过调整 MySQL 的配置文件来提高性能。下面是一些常用的配置项:
五、调优的 "终极心法"
最后,我想分享一些 MySQL 调优的 "终极心法",这些都是我多年工作经验的总结:
-
调优是一个持续的过程:没有一劳永逸的调优,随着业务的发展和数据量的增长,你需要不断地监控和优化数据库。
-
不要过度优化:调优的目标是满足业务需求,而不是追求极致的性能。过度优化会增加系统的复杂性和维护成本。
-
先优化 SQL 和索引,再优化配置:SQL 和索引优化的投入产出比最高,应该优先进行。只有在 SQL 和索引已经优化到极致的情况下,才考虑优化配置和硬件。
-
做好备份:在进行任何调优操作之前,一定要做好备份。万一出了问题,还能回滚到之前的状态。
-
学会使用工具:除了上面提到的 EXPLAIN 和慢查询日志,还有很多优秀的 MySQL 调优工具,比如 pt-query-digest、MySQL Workbench、Navicat 等,学会使用这些工具可以大大提高你的工作效率。
结语
MySQL 调优并不是什么高深莫测的技能,只要你掌握了正确的方法,并且多加练习,你也能成为一名优秀的 "数据库老中医"。
希望这篇文章能对你有所帮助。如果你觉得这篇文章写得不错,别忘了点赞、收藏、关注三连哦!我会持续分享更多有趣又实用的技术干货。
下一篇文章,我会给大家分享《那些年我踩过的 MySQL 调优坑:从删库跑路到年薪 30 万的血泪史》,敬请期待!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)