1. 硬件基礎優化
2. 存儲引擎配置優化(以InnoDB為主)
innodb_buffer_pool_size:這是InnoDB最重要的參數,用于緩存數據和索引。建議設置為系統總內存的60%-80%(如16GB內存可設置為10-12GB),能顯著提高數據訪問速度。innodb_log_file_size:增大日志文件大?。ㄈ?56MB-512MB)可減少日志切換頻率,提高事務處理性能。需平衡性能與數據恢復時間(日志越大,恢復越慢)。innodb_flush_log_at_trx_commit:該參數控制事務日志的刷新策略。默認值1(每次事務提交都刷新到磁盤)最安全,但性能較低;若可接受短暫數據丟失(如非金融場景),可設置為2(每秒刷新一次)或0(每秒刷新一次,崩潰時可能丟失1秒數據),大幅提升性能。innodb_file_per_table:將每個InnoDB表的數據和索引存儲在獨立文件(.ibd)中,便于單獨優化表(如OPTIMIZE TABLE)和遷移數據,避免單個文件過大導致的性能下降。3. 索引策略優化
WHERE、JOIN、ORDER BY的列創建索引(如主鍵、外鍵、高頻查詢字段),能大幅減少全表掃描。例如,WHERE user_id = 100的查詢,若user_id有索引,可直接定位到數據行。SHOW INDEX FROM table_name查看索引使用情況)。WHERE user_id = 100 AND status = 'active'),創建復合索引((user_id, status))能覆蓋多個查詢條件,提高查詢效率。注意索引列的順序(將選擇性高的列放在前面)。SELECT user_id, status FROM users WHERE user_id = 100,若(user_id, status)有索引,可直接從索引中獲取數據,無需回表查詢),減少磁盤IO。4. 查詢語句優化
EXPLAIN分析查詢:通過EXPLAIN SELECT ...命令查看查詢執行計劃,識別性能瓶頸(如全表掃描、索引未使用、臨時表創建)。例如,若type列為ALL,表示全表掃描,需優化索引。SELECT *:只選擇需要的列(如SELECT user_id, name FROM users),減少數據傳輸量和內存占用,尤其在查詢大表時效果明顯。JOIN操作:確保JOIN字段有索引(如ON a.user_id = b.user_id,a.user_id和b.user_id都應有索引),避免笛卡爾積。優先使用INNER JOIN(效率高)替代LEFT JOIN(除非需要保留左表所有數據)。LIMIT分頁:對于大數據量的分頁查詢(如LIMIT 10000, 10),避免使用大偏移量(可通過WHERE id > last_id ORDER BY id LIMIT 10優化,last_id為上一頁最后一條記錄的ID),減少查詢時間。5. 定期維護操作
OPTIMIZE TABLE table_name命令,整理表碎片(尤其是頻繁插入、更新、刪除的表),提高數據訪問效率。對于InnoDB表,該命令會重建表并整理索引。ANALYZE TABLE table_name命令更新表的統計信息,幫助優化器生成更優的執行計劃(如選擇正確的索引)。6. 緩存策略優化
query_cache_size=64M,query_cache_type=1),緩存查詢結果,減少重復查詢的開銷。但需注意,頻繁的寫操作(如高并發的INSERT、UPDATE)會導致查詢緩存頻繁失效,反而降低性能(MariaDB 10.1.7+版本已移除查詢緩存)。7. 監控與調優工具
top、vmstat、iostat等命令監控系統資源(CPU、內存、磁盤IO)的使用情況;使用SHOW STATUS、SHOW PROCESSLIST命令查看MariaDB的狀態(如連接數、查詢執行時間、鎖等待);使用Percona Monitoring and Management(PMM)、MariaDB Enterprise Monitor等專業工具,全面監控數據庫性能。slow_query_log=1,slow_query_log_file=/var/log/mysql/slow-queries.log,long_query_time=2),記錄執行時間超過閾值的查詢,定期分析這些查詢(用EXPLAIN),針對性優化。