如何利用Linux提升MariaDB性能
innodb_thread_concurrency)。ulimit -n 65535;永久生效则修改/etc/security/limits.conf,添加* soft nofile 65535; * hard nofile 65535。/etc/sysctl.conf,调整以下参数以提升I/O和内存管理性能: vm.swappiness=10:降低系统使用交换分区的倾向(值越低,越倾向于使用物理内存);vm.vfs_cache_pressure=50:减少内核回收目录和inode缓存的频率;net.core.somaxconn=65535:增加TCP连接队列长度,避免连接被拒绝。 修改后执行sysctl -p使配置生效。编辑MariaDB主配置文件(通常位于/etc/my.cnf或/etc/mysql/mariadb.conf.d/50-server.cnf),调整以下关键参数:
innodb_buffer_pool_size是InnoDB引擎的核心参数,建议设置为系统内存的50%-80%(如16GB内存可设为8G-12G),用于缓存表数据和索引,减少磁盘I/O。innodb_log_file_size设置为256M-1G(根据写入负载调整),较大的日志文件可减少日志切换频率,提高写入性能;innodb_flush_log_at_trx_commit=2(平衡性能与安全性,牺牲少量数据安全性换取更高写入速度,适用于对性能要求高的场景)。max_connections根据应用负载设置(如500-1000),避免过多连接导致资源耗尽;thread_cache_size=16,减少线程创建和销毁的开销。tmp_table_size=256M、max_heap_table_size=256M,增加内存临时表的大小,避免大查询使用磁盘临时表(影响性能)。character-set-server=utf8mb4、collation-server=utf8mb4_unicode_ci,统一字符集,避免因字符集转换导致的性能损耗。WHERE、JOIN、ORDER BY的列创建索引(如主键、唯一索引、普通索引);对于多列查询,使用复合索引(如(user_id, create_time)),但避免过度索引(过多索引会增加写操作的开销)。EXPLAIN SELECT ...命令查看查询执行计划,识别全表扫描、未使用索引等问题,针对性优化SQL语句(如添加缺失索引、调整查询逻辑)。SELECT *(只选择需要的列);用JOIN代替子查询(子查询可能导致多次扫描表);对于大数据量分页,使用LIMIT offset, size(如LIMIT 10000, 20),但可通过子查询优化(如WHERE id > last_id LIMIT 20)减少偏移量扫描。OPTIMIZE TABLE table_name命令,整理表碎片(尤其适用于频繁插入、删除数据的表),减少数据存储碎片,提高查询效率。binlog,可通过expire_logs_days设置过期时间)、慢查询日志(slow_query_log,定期归档或删除);删除无用数据(如过期订单、测试数据),减少表数据量。top、htop监控CPU使用率;free -h监控内存使用;iostat监控磁盘I/O;vmstat监控系统整体性能;Prometheus+Grafana搭建可视化监控平台,实时跟踪MariaDB的关键指标(如QPS、TPS、连接数、缓冲池命中率)。slow_query_log=1、slow_query_log_file=/var/log/mysql/slow-queries.log、long_query_time=2),定期分析执行时间超过阈值的查询,针对性优化慢查询。log_bin=ON、server-id)实现读写分离,将读请求分发到从库,减轻主库压力(适用于读多写少的场景)。