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
列過長的查詢)。