Ubuntu环境下MariaDB性能瓶颈破解指南
innodb_buffer_pool_size
)需占用系统内存的50%-80%(如16GB内存可分配8-12GB),足够的内存能减少磁盘I/O,显著提升数据读取速度。innodb_log_file_size
)的I/O延迟降低80%以上,建议选择NVMe协议的SSD以获得最佳性能。innodb_thread_concurrency
(建议设为CPU核心数的1-2倍),能有效提升并发查询能力。编辑MariaDB主配置文件(/etc/mysql/mariadb.conf.d/50-server.cnf
),重点调整以下核心参数:
innodb_buffer_pool_size
是性能关键参数,需根据服务器内存大小合理分配(如8GB内存设为5GB-6GB),用于缓存数据和索引,减少磁盘访问。innodb_log_file_size
(如256MB-512MB),减少日志切换频率;将innodb_flush_log_at_trx_commit
设为2(平衡性能与安全性,牺牲少量数据一致性以提升写入速度)。max_connections
(如200-500),避免过多连接导致资源耗尽;同时设置thread_cache_size
(如16-32),缓存空闲线程,减少线程创建/销毁的开销。tmp_table_size
和max_heap_table_size
(如256MB-512MB),避免大查询因临时表溢出到磁盘而变慢。WHERE
子句、JOIN
条件、ORDER BY
子句中的高频列创建索引(如CREATE INDEX idx_user_id ON users(user_id)
),可大幅提升查询速度。WHERE status='active' AND create_time > '2025-01-01'
),创建复合索引(如CREATE INDEX idx_status_time ON orders(status, create_time)
),注意将选择性高的列放在前面。SHOW INDEX FROM table_name
检查并删除未使用的索引。SELECT *
(只查询需要的列),使用EXPLAIN
分析查询计划(重点关注type
列是否为ref
/range
、rows
列是否过大),避免全表扫描。slow_query_log=1
,slow_query_log_file=/var/log/mysql/slow-queries.log
,long_query_time=2
),定期使用pt-query-digest
或mysqldumpslow
工具分析,定位执行慢的SQL语句。JOIN
代替),减少LIKE '%keyword%'
(前导通配符会导致全表扫描),使用LIMIT
分页(如SELECT * FROM table LIMIT 10, 20
)限制结果集大小。OPTIMIZE TABLE
命令(如OPTIMIZE TABLE large_table
),整理表碎片,减少数据存储空间,提升查询效率(对InnoDB表,该命令会重建表并整理索引)。ANALYZE TABLE
命令(如ANALYZE TABLE orders
)更新表的统计信息,帮助查询优化器生成更优的执行计划。binlog
)和慢查询日志(slow-queries.log
),释放磁盘空间(可通过PURGE BINARY LOGS BEFORE '2025-01-01';
命令删除指定日期前的二进制日志)。top
/htop
监控CPU、内存使用率,iostat
监控磁盘I/O(重点关注await
、%util
指标),netstat
/ss
监控网络连接(如ss -tulnp | grep mariadb
查看MariaDB监听端口及连接数)。SHOW STATUS
(如SHOW STATUS LIKE 'Threads_running';
)查看数据库状态变量,SHOW PROCESSLIST
查看当前执行的查询(重点关注Time
列过长的查询)。