如何利用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
)實現讀寫分離,將讀請求分發到從庫,減輕主庫壓力(適用于讀多寫少的場景)。