1. 硬件資源升級
2. 數據庫配置優化
innodb_buffer_pool_size
是InnoDB存儲引擎的核心參數,建議設置為系統內存的50%-80%(僅使用InnoDB時)。該參數決定了InnoDB緩存數據和索引的內存大小,增大此值能減少磁盤I/O。max_connections
需根據應用并發需求調整(如100-300),避免過多連接導致內存耗盡;thread_cache_size
可緩存空閑線程,減少線程創建/銷毀的開銷(MariaDB 10.2+無需頻繁調整)。query_cache_type=OFF
)。僅在數據變化不頻繁且重復查詢多的場景下啟用(如query_cache_type=DEMAND
),并設置合理的query_cache_size
(如100M)和query_cache_limit
(單條查詢緩存上限,默認1M)。innodb_log_file_size
(如1-2G)和innodb_log_files_in_group
(如2-4)增大重做日志大小,減少日志刷盤頻率,提升寫入性能;sync_binlog
設置為0(性能優先)或1(數據安全優先),根據業務需求權衡。3. 索引優化
WHERE
、JOIN
、ORDER BY
、GROUP BY
子句中頻繁使用的列創建索引(如B樹索引)。避免過度索引(過多索引會增加寫入開銷)。CREATE INDEX idx_name_age ON users(name, age)
),并將查詢中最常用的列放在前面。OPTIMIZE TABLE
命令重建索引,整理索引碎片;通過SHOW INDEX FROM table_name
查看索引使用情況,刪除未使用的索引。4. 查詢語句優化
EXPLAIN SELECT ...
命令查看查詢執行計劃,識別性能瓶頸(如全表掃描、未使用索引),針對性優化。SELECT id, name FROM users
而非SELECT * FROM users
)。JOIN
條件中的列有索引;優先使用INNER JOIN
而非OUTER JOIN
(OUTER JOIN
性能更低);避免子查詢(子查詢可能轉化為臨時表,影響性能)。LIMIT offset, size
限制返回的行數(如SELECT * FROM products LIMIT 0, 10
)。WHERE YEAR(create_time) = 2025
會導致索引失效,改為WHERE create_time BETWEEN '2025-01-01' AND '2025-12-31'
。5. 定期維護
OPTIMIZE TABLE
命令(如每周一次),整理表碎片,回收未使用的空間(尤其適用于頻繁插入/刪除的表)。DELETE FROM logs WHERE create_time < '2024-01-01'
),釋放存儲空間。ANALYZE TABLE
命令手動更新,幫助優化器生成更優的執行計劃。6. 連接與緩存優化
mysqlnd
、HikariCP
)管理數據庫連接,減少連接創建和銷毀的開銷,提高并發處理能力。7. 監控與分析
slow_query_log=ON
和long_query_time=1
(記錄執行時間超過1秒的查詢),通過mysqldumpslow
或pt-query-digest
工具分析慢查詢,定位性能瓶頸。top
、htop
、vmstat
、iostat
等工具監控系統資源(CPU、內存、磁盤I/O);使用Prometheus+Grafana、Zabbix等工具實時監控數據庫性能(如QPS、TPS、連接數、緩沖池命中率),及時發現并解決問題。