0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MySQL配置调优技巧

马哥Linux运维 ? 来源:马哥Linux运维 ? 2025-07-31 10:27 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

MySQL运维实战:从配置调优到SQL性能优化的完整攻略

作者简介:资深运维工程师,专注数据库性能优化8年,曾优化过千万级用户系统的MySQL集群。今天分享一些压箱底的MySQL调优技巧,帮你轻松应对生产环境的各种挑战。

开篇:一个真实的生产事故

上个月,我们公司的核心业务系统突然出现大面积超时,用户投诉电话不断。经过紧急排查,发现是MySQL服务器CPU飙升到99%,大量慢查询堆积。通过一系列配置调优和SQL优化,最终在30分钟内恢复了服务。

这次事故让我深刻认识到:MySQL调优不是纸上谈兵,而是运维工程师的核心竞争力。

Part 1: MySQL配置调优 - 让你的数据库飞起来

1.1 内存配置:合理分配是关键

# my.cnf 核心内存配置
[mysqld]
# 缓冲池大小:通常设为物理内存的70-80%
innodb_buffer_pool_size=8G

# 缓冲池实例数:提高并发性能
innodb_buffer_pool_instances=8

# 日志缓冲区:减少磁盘I/O
innodb_log_buffer_size=64M

# 查询缓存:对读密集型应用很重要(MySQL 8.0已移除)
query_cache_size=256M
query_cache_type=1

实战技巧:如何确定最佳的innodb_buffer_pool_size?

-- 查看缓冲池使用情况
SELECT
 ROUND(A.num*100.0/B.num,2)ASbuffer_pool_hit_rate
FROM
 (SELECTvariable_valueASnumFROMperformance_schema.global_statusWHEREvariable_name='Innodb_buffer_pool_read_requests') A,
 (SELECTvariable_valueASnumFROMperformance_schema.global_statusWHEREvariable_name='Innodb_buffer_pool_reads') B;

缓冲池命中率应该保持在99%以上。

1.2 连接与线程优化

# 连接相关配置
max_connections=2000
max_connect_errors=10000
connect_timeout=60
wait_timeout=28800
interactive_timeout=28800

# 线程缓存
thread_cache_size=64
thread_concurrency=16

运维经验分享

?max_connections不是越大越好,要根据服务器配置合理设置

? 监控Threads_connected和Threads_running,避免连接数暴涨

1.3 InnoDB核心参数调优

# InnoDB核心配置
innodb_file_per_table=1
innodb_flush_log_at_trx_commit=2
innodb_log_file_size=1G
innodb_log_files_in_group=2
innodb_max_dirty_pages_pct=75
innodb_io_capacity=2000
innodb_read_io_threads=8
innodb_write_io_threads=8

性能提升案例
将innodb_flush_log_at_trx_commit从1改为2,TPS提升了40%(需要权衡数据安全性)。

Part 2: SQL性能优化 - 让慢查询无处遁形

2.1 索引优化:运维工程师的必杀技

建立复合索引的黄金法则

-- 错误示例:每个字段单独建索引
CREATEINDEX idx_user_idONorders(user_id);
CREATEINDEX idx_statusONorders(status);
CREATEINDEX idx_create_timeONorders(create_time);

-- 正确示例:根据查询模式建立复合索引
CREATEINDEX idx_user_status_timeONorders(user_id, status, create_time);

索引使用情况分析

-- 查找未使用的索引
SELECT
 object_schema,
 object_name,
 index_name,
 count_star,
 count_read,
 count_insert,
 count_update,
 count_delete
FROMperformance_schema.table_io_waits_summary_by_index_usage
WHEREindex_nameISNOT NULL
ANDcount_star=0
ANDobject_schema='your_database'
ORDERBYobject_schema, object_name;

2.2 查询优化实战案例

案例1:千万级数据表的分页优化

-- 传统分页(性能差)
SELECT*FROMuser_logs
WHEREuser_id=12345
ORDERBYcreated_atDESC
LIMIT1000000,20;

-- 优化后的分页(性能提升100倍)
SELECT*FROMuser_logs
WHEREuser_id=12345
ANDid

案例2:子查询转JOIN优化

-- 慢查询:使用子查询
SELECT*FROMorders o
WHEREo.user_idIN(
SELECTu.idFROMusers uWHEREu.level='VIP'
);

-- 优化:转换为JOIN
SELECTo.*FROMorders o
INNERJOINusers uONo.user_id=u.id
WHEREu.level='VIP';

2.3 慢查询日志分析

开启慢查询日志

slow_query_log=ON
slow_query_log_file= /var/log/mysql/slow.log
long_query_time=1
log_queries_not_using_indexes=ON

使用pt-query-digest分析慢查询

# 安装percona-toolkit
sudoapt-get install percona-toolkit

# 分析慢查询日志
pt-query-digest /var/log/mysql/slow.log > slow_query_report.txt

Part 3: 高级调优技巧

3.1 读写分离配置

# Python示例:使用PyMySQL实现读写分离
importpymysql
importrandom

classMySQLPool:
 def__init__(self):
   # 主库配置(写操作)
   self.master = {
     'host':'192.168.1.10',
     'user':'root',
     'password':'password',
     'database':'mydb'
    }
   
   # 从库配置(读操作)
   self.slaves = [
      {'host':'192.168.1.11','user':'root','password':'password','database':'mydb'},
      {'host':'192.168.1.12','user':'root','password':'password','database':'mydb'}
    ]
 
 defget_read_connection(self):
    slave_config = random.choice(self.slaves)
   returnpymysql.connect(**slave_config)
 
 defget_write_connection(self):
   returnpymysql.connect(**self.master)

3.2 MySQL监控脚本

#!/bin/bash
# MySQL性能监控脚本

# 获取MySQL状态
mysql_status() {
  mysql -e"SHOW GLOBAL STATUS;"| grep -E"(Connections|Questions|Threads_running|Slow_queries)"
}

# 检查InnoDB状态
innodb_status() {
  mysql -e"SHOW ENGINE INNODB STATUSG"| grep -A 10"BUFFER POOL AND MEMORY"
}

# 获取当前运行的查询
current_queries() {
  mysql -e"SELECT * FROM information_schema.processlist WHERE COMMAND != 'Sleep' ORDER BY TIME DESC;"
}

echo"=== MySQL Performance Monitor ===="
echo"1. Connection Status:"
mysql_status
echo""
echo"2. InnoDB Buffer Pool:"
innodb_status
echo""
echo"3. Current Running Queries:"
current_queries

3.3 分库分表策略

水平分表示例

-- 按时间分表
CREATE TABLEuser_logs_202501LIKEuser_logs;
CREATE TABLEuser_logs_202502LIKEuser_logs;

-- 按hash分表
CREATE TABLEuser_data_0LIKEuser_data;
CREATE TABLEuser_data_1LIKEuser_data;

-- 分表路由逻辑(Python)
def get_table_name(user_id, table_count=10):
 returnf"user_data_{user_id % table_count}"

Part 4: 生产环境实战经验

4.1 MySQL故障排查流程

# 1. 检查MySQL服务状态
systemctl status mysql

# 2. 查看错误日志
tail-f /var/log/mysql/error.log

# 3. 检查磁盘空间
df-h

# 4. 查看当前连接数
mysql -e"SHOW PROCESSLIST;"

# 5. 分析慢查询
mysql -e"SELECT * FROM information_schema.processlist WHERE TIME > 10;"

4.2 备份恢复最佳实践

# 热备份脚本
#!/bin/bash
DATE=$(date+%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/mysql"
DB_NAME="production_db"

# 使用mysqldump进行逻辑备份
mysqldump --single-transaction --routines --triggers 
 --master-data=2 --databases$DB_NAME
 | gzip >$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz

# 使用xtrabackup进行物理备份(推荐)
xtrabackup --backup --target-dir=$BACKUP_DIR/full_${DATE}

4.3 高可用架构部署

MySQL主从复制配置

主库配置:

[mysqld]
server-id=1
log-bin= mysql-bin
binlog-format= ROW
gtid-mode=ON
enforce-gtid-consistency=ON

从库配置:

[mysqld]
server-id=2
relay-log= relay-bin
read-only=1

Part 5: 性能调优工具箱

5.1 必备监控工具

1. Prometheus + Grafana监控

# prometheus.yml配置
global:
scrape_interval:15s

scrape_configs:
-job_name:'mysql'
 static_configs:
  -targets:['localhost:9104']

2. pt-stalk故障诊断

# 当MySQL出现性能问题时自动收集诊断信息
pt-stalk --function=processlist --variable=Threads_running 
 --threshold=25 --match-command=Query --collect-oprofile 
 --collect-strace --collect-tcpdump

5.2 压测工具使用

sysbench压测示例

# 准备测试数据
sysbench oltp_read_write --table-size=1000000 
 --mysql-host=localhost --mysql-user=root 
 --mysql-password=password --mysql-db=testdb prepare

# 执行压测
sysbench oltp_read_write --table-size=1000000 
 --mysql-host=localhost --mysql-user=root 
 --mysql-password=password --mysql-db=testdb 
 --threads=16 --time=300 run

总结:MySQL调优的核心思路

1.监控先行:建立完善的监控体系,及时发现问题

2.配置为基:合理的参数配置是性能的基础

3.索引为王:良好的索引设计解决80%的性能问题

4.架构为本:读写分离、分库分表解决高并发问题

5.持续优化:性能调优是一个持续的过程

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 集群
    +关注

    关注

    0

    文章

    113

    浏览量

    17455
  • 数据库
    +关注

    关注

    7

    文章

    3939

    浏览量

    66470
  • MySQL
    +关注

    关注

    1

    文章

    869

    浏览量

    28038

原文标题:MySQL运维实战:从配置调优到SQL性能优化的完整攻略

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    0基础学Mysql:mysql入门视频教程!

    的性能技术掌握基于MySQL的架构设计方案课程目录:第1节 MySQL课程介绍和MySQL的基础概念(1)第2节
    发表于 07-08 10:51

    infosphere CDC性能的文档

    infosphere CDC性能的文档
    发表于 09-07 09:30 ?7次下载
    infosphere CDC性能<b class='flag-5'>调</b><b class='flag-5'>优</b>的文档

    MySQL安装说明及配置

    本文档为C/C++学习指南(MySQL 篇)的官方文档,本文介绍的 Windows 上安装 MySQL 5.5 服务器的方法,以及安装后的配置
    发表于 09-11 16:54 ?5次下载
    <b class='flag-5'>MySQL</b>安装说明及<b class='flag-5'>配置</b>

    机器学习如何数据库

    在延迟方面,相比 Postgres 默认配置,OtterTune、工具、DBA 和 RDS 的配置获得了近似的提升。我们大概可以把这归于 OLTP-Bench 客户端和 DBMS
    发表于 11-07 13:50 ?1254次阅读
    机器学习如何<b class='flag-5'>调</b><b class='flag-5'>优</b>数据库

    如何对电机进行的好处是什么?

    如何自动对电机进行
    的头像 发表于 08-22 00:03 ?3488次阅读

    ElasticSearch需要注意什么

    用户修改即可使用,当你更清楚的知道你想如何使用es后,你可以作很多的优化以提高你的用例的性能,下面的内容告诉你 你应该/不应该 修改哪些配置。 第一部分:索引速度https
    的头像 发表于 09-02 17:24 ?1701次阅读

    Linux用电功耗的笔记分享

    整理一些Linux用电功耗的笔记,分享给小伙伴,关于用电个人觉得
    的头像 发表于 06-23 15:19 ?4819次阅读

    关于JVM的知识

    最近很多小伙伴跟我说,自己学了不少JVM的知识,但是在实际工作中却不知道何时对JVM进行。今天,我就为大家介绍几种JVM
    的头像 发表于 09-14 14:54 ?1077次阅读

    KeenOpt算法框架实现对调对象和配套工具的快速适配

    今天, KeenTune 再次带来开源重磅特性——新增通用的算法框架:keenopt。有了 keenopt 的加持,KeenTune 不再仅仅是支持灵活扩展场景的
    的头像 发表于 11-11 09:31 ?1176次阅读

    jvm主要是哪里

    JVM主要涉及内存管理、垃圾回收、线程管理与锁优化等方面。下面将详细介绍每个方面的技术和策略以及如何进行优化。 内存管理 JVM的内存管理主要包括堆内存、栈内存和非堆内存。堆内
    的头像 发表于 12-05 11:37 ?1861次阅读

    jvm工具有哪些

    JVM是提高Java应用程序性能的重要手段,而JVM工具则是辅助开发人员进行工作的利
    的头像 发表于 12-05 11:44 ?1510次阅读

    鸿蒙开发实战:【性能组件】

    性能组件包含系统和应用框架,旨在为开发者提供一套性能平台,可以用来分析内存、性能等问
    的头像 发表于 03-13 15:12 ?885次阅读
    鸿蒙开发实战:【性能<b class='flag-5'>调</b><b class='flag-5'>优</b>组件】

    深度解析JVM实践应用

    Tomcat自身的是针对conf/server.xml中的几个参数的设置。首先是对这几个参数的含义要有深刻而清楚的理解。
    的头像 发表于 04-01 10:24 ?820次阅读
    深度解析JVM<b class='flag-5'>调</b><b class='flag-5'>优</b>实践应用

    MMC SW算法

    电子发烧友网站提供《MMC SW算法.pdf》资料免费下载
    发表于 09-20 11:14 ?0次下载
    MMC SW<b class='flag-5'>调</b><b class='flag-5'>优</b>算法

    MMC DLL

    电子发烧友网站提供《MMC DLL.pdf》资料免费下载
    发表于 10-11 11:48 ?0次下载
    MMC DLL<b class='flag-5'>调</b><b class='flag-5'>优</b>