Ubuntu环境下MariaDB查询优化技巧
innodb_buffer_pool_size)设置为物理内存的50%-80%(如4GB内存可设为3GB-3.2GB),用于缓存数据和索引。编辑MariaDB配置文件(通常为/etc/mysql/mariadb.conf.d/50-server.cnf或/etc/my.cnf),调整关键参数:
innodb_buffer_pool_size=物理内存的70%(如8GB内存设为5.6GB),这是InnoDB性能的核心参数。innodb_log_file_size=256M-1G,较大的日志文件可减少刷新频率,提高写入性能。innodb_flush_log_at_trx_commit=2(平衡性能与安全性,宕机可能丢失1秒数据;若需强一致性则设为1)。tmp_table_size=max_heap_table_size=256M,避免大查询因临时表溢出到磁盘。max_connections=300-500(根据应用需求调整,避免过多连接导致资源耗尽)。WHERE、JOIN、ORDER BY子句中频繁使用的列创建索引(如CREATE INDEX idx_user_id ON users(user_id))。WHERE user_id=1 AND status=1),创建复合索引(CREATE INDEX idx_user_status ON users(user_id, status)),注意索引顺序需匹配查询条件。OPTIMIZE TABLE或ALTER TABLE table_name ENGINE=InnoDB,整理索引碎片,提升查询效率。EXPLAIN SELECT ...查看查询计划,重点关注type(是否为ref、range等高效类型)、rows(扫描行数)、Extra(是否有Using filesort或Using temporary等警告),针对性优化。SELECT name, email FROM users),减少数据传输量和内存占用。JOIN(如SELECT u.name FROM users u JOIN orders o ON u.id=o.user_id)比子查询(如SELECT name FROM users WHERE id IN (SELECT user_id FROM orders))更高效。LIMIT 10000, 10),使用WHERE id > last_id ORDER BY id LIMIT 10(last_id为上一页最后一条记录的ID),避免OFFSET的大偏移量扫描。WHERE YEAR(create_time)=2025),这会导致索引失效;减少OR条件(可改用UNION替代)。slow_query_log=1,slow_query_log_file=/var/log/mysql/slow-queries.log,long_query_time=2),定期分析并优化执行时间超过阈值的查询。ANALYZE TABLE table_name更新表的统计信息,帮助查询优化器生成更优的执行计划。mysqldump或mariabackup),确保数据安全,避免因优化操作导致数据丢失。query_cache_size=64M,query_cache_type=1),注意缓存失效对性能的影响。OPTIMIZE TABLE,每季度评估配置参数是否适配当前业务需求。