CentOS环境下MySQL性能调优方法
top命令监控%Cpu(s)指标)。ping或iperf工具测试网络延迟和吞吐量)。innodb_buffer_pool_size:InnoDB存储引擎的核心缓存池,用于缓存数据页、索引页等。建议设置为物理内存的50%-80%(专用数据库服务器),若数据量远小于内存,可设为数据量的1.2倍(避免内存浪费)。例如,32GB内存服务器可设为20GB-25GB。innodb_log_buffer_size:Redo Log的内存缓冲区,减少磁盘写入频率。写密集场景(如高并发插入)可调至64MB-256MB(默认16MB),避免频繁刷盘。key_buffer_size:MyISAM索引缓存(MyISAM已逐渐被淘汰,纯InnoDB场景可设为64MB-128MB即可)。innodb_flush_log_at_trx_commit:控制Redo Log刷盘策略,平衡性能与数据安全性。0(每秒刷盘,性能最高但风险最高,适合非核心业务)、1(默认,事务提交时立即刷盘,最安全,适合金融等强一致性场景)、2(事务提交时写入OS缓存,每秒由OS刷盘,崩溃时可能丢失1秒数据,性能中等)。innodb_flush_method:定义InnoDB与文件系统交互的刷盘方式,Linux系统推荐设为O_DIRECT(绕过OS缓存,减少二次拷贝,提升I/O效率)。innodb_io_capacity:InnoDB后台任务的I/O容量(如刷脏页、合并插入缓冲),根据磁盘性能设置(SSD可设为2000-4000,HDD可设为200-400)。max_connections:最大并发连接数,根据应用需求调整(如应用服务器数量×每个应用的连接数)。避免设置过高(如超过1000),否则会导致内存耗尽(每个连接占用约2-4MB内存)。thread_cache_size:线程缓存大小,减少线程创建和销毁的开销。建议设置为50-100(根据并发连接数调整,如max_connections为500,可设为50)。WHERE、JOIN、ORDER BY的列创建索引(如user_id、order_date)。使用覆盖索引(索引包含查询所需的所有列),避免回表操作(如SELECT user_id, name FROM users WHERE user_id = 1,若(user_id, name)为索引,则无需回表查询name)。(a, b, c),查询条件包含a、a AND b、a AND b AND c时能用到索引,而b、c则不能);避免在低基数列(如性别,只有“男”“女”两种值)上创建索引(选择性低,无法有效减少扫描行数)。SELECT *(只选择需要的列,减少数据传输量);减少JOIN操作(尽量用关联字段创建索引,如ON a.user_id = b.user_id,并确保a.user_id有索引);使用LIMIT限制返回行数(如SELECT * FROM orders ORDER BY order_date DESC LIMIT 10,避免全表扫描)。EXPLAIN命令查看查询执行计划,重点关注type(访问类型,从最优到最差依次为system、const、eq_ref、ref、range、index、ALL,ALL表示全表扫描,需优化)、Extra(额外信息,出现Using filesort(文件排序,需优化排序字段索引)、Using temporary(临时表,需优化查询逻辑)时需调整)。JOIN操作(如SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE age > 30)可改为SELECT o.* FROM orders o JOIN users u ON o.user_id = u.id WHERE u.age > 30,JOIN通常比子查询更高效)。JOIN操作;反规范化(如将用户信息冗余到订单表)减少JOIN,提高查询性能,但会增加数据更新的开销(如用户信息修改需同步到订单表)。根据业务场景权衡(如电商订单系统可适当反规范化)。PARTITION BY RANGE (YEAR(order_date)))提高查询效率(查询时只需扫描对应分区,减少数据量)。orders_2024),减少主表的大小(如orders表从1000万行减少到100万行),提高查询和维护效率。OPTIMIZE TABLE命令整理表碎片(如频繁的INSERT、UPDATE、DELETE操作会导致碎片化,降低查询效率),释放空间。例如,OPTIMIZE TABLE users;(InnoDB表会重建表并整理碎片)。ANALYZE TABLE命令更新表的统计信息(如行数、索引基数),帮助优化器生成更优的执行计划。例如,ANALYZE TABLE orders;。binlog,用于复制和恢复)、慢查询日志(slow_query_log),避免日志文件过大占用磁盘空间。可通过PURGE BINARY LOGS BEFORE '2025-01-01';命令清理指定日期前的二进制日志。slow_query_log = 1,long_query_time = 2,slow_query_log_file = /var/log/mysql/mysql-slow.log),记录执行时间超过阈值的查询(如long_query_time = 2表示执行时间超过2秒的查询),使用pt-query-digest或mysqltuner.pl工具分析慢查询日志,找出性能瓶颈(如高频慢查询、未使用索引的查询)。MySQLTuner(wget http://mysqltuner.pl/ -O mysqltuner.pl; perl mysqltuner.pl)生成性能报告,提供内存、连接、I/O等方面的优化建议;使用Percona Toolkit(如pt-index-usage分析索引使用情况,pt-table-checksum检查表的一致性)进行深入性能调优;使用Prometheus+Grafana实时监控MySQL的性能指标(如QPS、TPS、连接数、缓冲池命中率),及时发现异常。