Ubuntu环境下MariaDB性能优化技巧
innodb_buffer_pool_size需求。innodb_thread_concurrency参数调整线程并发数。编辑MariaDB主配置文件(通常位于/etc/mysql/mariadb.conf.d/50-server.cnf或/etc/my.cnf),调整以下关键参数:
innodb_buffer_pool_size:InnoDB引擎的核心缓存参数,用于缓存数据和索引。建议设置为系统内存的50%-80%(如16GB内存可设为10-12GB),能有效减少磁盘I/O。innodb_log_file_size:增大重做日志文件大小(如256MB-1GB),减少日志切换频率,提升写入性能。需配合innodb_flush_log_at_trx_commit=2(平衡性能与安全性)使用。max_connections:根据应用需求调整最大连接数(如500-1000),避免连接数过多导致资源耗尽。同时设置thread_cache_size(如16-32),缓存空闲线程,减少线程创建开销。query_cache_size:仅适用于读多写少场景(如报表系统),建议设置为64MB-128MB(MariaDB 10.0+仍支持)。注意:写密集型场景(如电商)不建议开启,因缓存失效频繁会影响性能。slow_query_log:启用慢查询日志(slow_query_log=1),设置long_query_time=2(超过2秒的查询视为慢查询),并指定日志路径(如/var/log/mysql/slow-queries.log),便于定位性能瓶颈。WHERE、JOIN、ORDER BY的列创建索引(如user_id、order_date)。使用CREATE INDEX idx_name ON table_name(column_name)命令创建。WHERE user_id=1 AND status=1),创建复合索引(如CREATE INDEX idx_user_status ON orders(user_id, status)),遵循“最左前缀”原则(查询条件需包含索引左侧列)。SHOW INDEX FROM table_name检查索引,删除未使用或冗余索引。varchar(255)的email),使用前缀索引(如CREATE INDEX idx_email_prefix ON users(email(10))),减小索引体积,提高查询效率。EXPLAIN分析查询:在SQL语句前添加EXPLAIN关键字(如EXPLAIN SELECT * FROM orders WHERE user_id=1),查看查询执行计划,识别全表扫描、未使用索引等问题。SELECT *:只查询需要的列(如SELECT id, name FROM users),减少数据传输量和内存消耗。JOIN代替,如SELECT o.id FROM orders o JOIN users u ON o.user_id=u.id WHERE u.status=1),减少不必要的JOIN和GROUP BY操作。LIMIT 10000, 10),使用WHERE条件替代OFFSET(如SELECT id, name FROM orders WHERE id > 10000 ORDER BY id LIMIT 10),减少回表查询次数。OPTIMIZE TABLE命令(如OPTIMIZE TABLE orders),整理表碎片,减少数据存储空间,提高查询效率。适用于频繁更新的表。/var/log/mysql/slow-queries.log)和二进制日志(/var/log/mysql/mysql-bin.*),释放磁盘空间。可通过logrotate工具自动归档。ANALYZE TABLE命令(如ANALYZE TABLE orders)更新表的统计信息,帮助查询优化器生成更优的执行计划。top、htop监控系统资源(CPU、内存、磁盘I/O);使用mysqladmin status、SHOW STATUS查看MariaDB状态(如连接数、缓存命中率);使用Prometheus+Grafana搭建可视化监控平台,实时跟踪数据库性能。innodb_buffer_pool_size)或优化查询,持续提升数据库性能。