优化Ubuntu上MariaDB性能的全面指南
innodb_thread_concurrency
参数需匹配CPU核心数)。编辑MariaDB主配置文件(/etc/mysql/mariadb.conf.d/50-server.cnf
),调整以下关键参数:
innodb_buffer_pool_size = 物理内存×70%
(如16GB内存设为11GB),用于缓存数据和索引,减少磁盘访问。innodb_log_file_size = 256M-1G
(根据写入量调整),较大的日志文件可减少日志切换频率,提升写入性能。innodb_flush_log_at_trx_commit = 2
(平衡性能与安全性),设置为2时每秒刷新日志到磁盘,牺牲少量数据安全性换取更高性能(生产环境需谨慎评估)。max_connections = 200-500
(根据应用并发需求调整),避免过多连接导致资源耗尽(可通过连接池优化连接复用)。tmp_table_size = max_heap_table_size = 256M-512M
,增大临时表大小,减少磁盘临时表的使用(避免大查询因临时表溢出而变慢)。slow_query_log = 1
、long_query_time = 2
、slow_query_log_file = /var/log/mysql/slow-queries.log
,启用慢查询日志并设置阈值(如超过2秒的查询),便于定位性能瓶颈。WHERE
、JOIN
、ORDER BY
的列创建索引(如CREATE INDEX idx_user_id ON orders(user_id)
),避免全表扫描。WHERE user_id=1 AND status=1
),创建组合索引(CREATE INDEX idx_user_status ON orders(user_id, status)
),提高多条件查询效率。OPTIMIZE TABLE
或ALTER TABLE table_name ENGINE=InnoDB
重建索引,恢复索引效率。EXPLAIN SELECT * FROM orders WHERE user_id=1
,查看查询执行计划(关注type
、key
、rows
字段),识别全表扫描、未使用索引等问题。SELECT id, name FROM users
),减少数据传输量和内存占用。JOIN
代替IN (SELECT ...)
)、减少函数调用(如不在WHERE
列上使用函数,防止索引失效)。LIMIT 10000, 10
),使用延迟关联(SELECT * FROM orders WHERE id > (SELECT id FROM orders ORDER BY id LIMIT 10000, 1) LIMIT 10
),减少回表查询次数。OPTIMIZE TABLE
(针对MyISAM或InnoDB碎片化严重的表),整理表碎片,提高数据读取效率。PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY)
)和二进制日志(避免日志文件过大占用磁盘空间)。top
、htop
监控CPU和内存使用情况,iostat
监控磁盘I/O,netstat
/ss
监控网络连接状态,及时发现资源瓶颈。SHOW STATUS
查看状态变量(如Threads_running
、Innodb_buffer_pool_hit_rate
),SHOW PROCESSLIST
查看当前执行的查询,快速定位高负载操作。