Ubuntu环境下MySQL性能调优的关键技巧可分为以下几大类:
硬件是数据库性能的基础,需优先满足以下要求:
innodb_buffer_pool_size)应占物理内存的50%-80%,用于缓存数据和索引,减少磁盘IO。调整内核参数以提升系统并发处理能力:
/etc/sysctl.conf文件,添加或修改以下参数:
net.ipv4.tcp_tw_reuse = 1:复用TIME_WAIT状态的连接,减少连接建立开销;net.ipv4.tcp_fin_timeout = 30:缩短TIME_WAIT状态的超时时间(默认60秒);fs.file-max = 65535:增加系统最大文件描述符数量(MySQL每个连接需1个文件描述符);vm.swappiness = 10:降低系统使用swap的倾向(设为10表示仅在内存不足时使用swap,避免频繁磁盘交换)。sudo sysctl -p使参数生效。编辑MySQL主配置文件(通常位于/etc/mysql/mysql.conf.d/mysqld.cnf),调整关键参数:
innodb_buffer_pool_size:设置为物理内存的50%-80%(如16GB内存设为8GB),是InnoDB性能的核心参数;innodb_log_file_size:设置为256M-1G(根据事务量调整,事务量大则增大),提升事务提交效率;innodb_flush_log_at_trx_commit:设为1(保证数据安全性,每次事务提交都刷新日志到磁盘);若对性能要求极高且可接受少量数据丢失,可设为0或2(每秒刷新一次)。max_connections:根据应用负载设置(如500-1000),避免过多连接导致内存耗尽;query_cache_type:设为0(禁用查询缓存,因InnoDB有自己的缓冲池,且查询缓存在高并发下易成为瓶颈);tmp_table_size和max_heap_table_size:均设为64M-256M(控制临时表大小,避免大临时表使用磁盘)。EXPLAIN分析查询执行计划,避免全表扫描(重点关注type列是否为range、ref或const,key列是否使用了索引);SELECT *,只查询必要的字段;JOIN代替子查询(子查询可能导致临时表生成,降低性能);LIKE '%keyword%'这类前导模糊查询(无法命中索引)。WHERE、JOIN、ORDER BY的列创建索引(如用户ID、订单号);(a,b,c),查询条件包含a或a AND b时可命中索引,但b或c单独无法命中);INT代替VARCHAR存储数字,DATE代替VARCHAR存储日期);OPTIMIZE TABLE命令(针对InnoDB表,可整理碎片、回收空间,提升查询效率)。SHOW PROCESSLIST查看当前运行的查询,找出长时间运行(如超过10秒)的慢查询;SHOW STATUS关注关键指标(如Innodb_buffer_pool_wait_free表示缓冲池等待空闲页的次数,数值过高说明缓冲池不足;Handler_read_rnd_next表示随机读次数,数值过高说明索引利用不佳)。slow_query_log = 1,slow_query_log_file = /var/log/mysql/slow_queries.log,long_query_time = 2),记录执行时间超过2秒的查询,便于后续分析。OPTIMIZE TABLE(针对频繁更新的表);mysqldump或物理备份工具),并测试备份恢复流程;