MariaDB在Linux上的性能瓶颈破解方法
innodb_buffer_pool_size通常设置为物理内存的50%-80%),减少磁盘I/O操作。vm.swappiness=10:降低系统使用交换分区的倾向,避免内存不足时频繁换页;vm.vfs_cache_pressure=50:控制内核回收用于目录和inode缓存的内存,减少不必要的缓存清理;ulimit -n 65535:提高系统允许的最大文件描述符数量,避免大量连接时出现“Too many open files”错误。innodb_buffer_pool_size:设置为系统内存的50%-80%(如4GB内存可设为3-3.2GB),用于缓存InnoDB表数据和索引,是提升InnoDB性能的关键参数。innodb_log_file_size:增大重做日志文件大小(如256MB-1GB),减少日志刷盘频率,提高写入性能(需平衡数据安全性,若设置为大于4GB,需调整innodb_log_files_in_group)。innodb_flush_log_at_trx_commit:设为2(默认1),牺牲部分数据安全性(如系统崩溃可能丢失1秒内的事务)以换取更高性能(适用于对数据一致性要求不高的场景)。max_connections:根据应用需求设置合理最大连接数(如500),避免过多连接导致资源耗尽;同时调整thread_cache_size(如100),缓存空闲线程,减少线程创建和销毁的开销。tmp_table_size和max_heap_table_size:增加临时表大小(如256MB),避免大查询因临时表超过限制而写入磁盘,影响性能。query_cache_size=64M),但需注意高并发写入场景下,查询缓存可能成为瓶颈(需根据实际情况调整或禁用)。WHERE子句、JOIN条件、ORDER BY的列创建索引(如CREATE INDEX idx_user_id ON users(user_id)),加速查询速度。INSERT、UPDATE需维护索引),并占用额外存储空间,需定期审查并删除未使用的索引。varchar(255)),使用前缀索引(如CREATE INDEX idx_name ON table_name(column_name(10))),减小索引体积;WHERE a=1 AND b=2),创建复合索引(如CREATE INDEX idx_ab ON table_name(a, b)),覆盖多个查询条件。EXPLAIN SELECT ...命令查看查询执行计划,识别全表扫描、未使用索引等问题(如type列为ALL表示全表扫描),针对性优化。SELECT *:只选择需要的列(如SELECT id, name FROM users),减少数据传输量和内存消耗;JOIN代替子查询:子查询可能导致多次扫描表,JOIN通常更高效(如SELECT u.name, o.order_id FROM users u JOIN orders o ON u.id=o.user_id);LIMIT分页:对于海量数据分页(如LIMIT 10000, 10),结合索引优化,避免深度分页导致的性能下降。WHERE YEAR(create_time)=2025会导致索引失效,应改为WHERE create_time BETWEEN '2025-01-01' AND '2025-12-31'。OPTIMIZE TABLE命令(如OPTIMIZE TABLE large_table),整理表碎片,减少数据存储空间,提高查询效率(适用于频繁更新的表)。expire_logs_days=7,设置日志保留7天)、慢查询日志,释放磁盘空间;避免临时文件占用过多磁盘空间。ANALYZE TABLE命令(如ANALYZE TABLE users)更新表的统计信息,帮助查询优化器生成更优的执行计划。slow_query_log=ON,long_query_time=1,记录执行时间超过1秒的查询),定期分析慢查询日志,针对性优化慢查询语句。