1. 硬件層面優化
innodb_buffer_pool_size
)。thread_cache_size
、max_threads
等參數與CPU核心數匹配。2. 配置文件(my.cnf)調優
配置文件通常位于/etc/my.cnf
或/etc/mysql/my.cnf
,需根據服務器內存大小調整核心參數:
innodb_buffer_pool_size
設置為服務器總內存的70%-80%(如16GB內存可設為12GB),用于緩存數據和索引,是提升InnoDB性能的關鍵參數。innodb_log_file_size
設置為256M-2G(根據寫入負載調整),較大的日志文件能減少日志刷盤次數,提高寫入性能;innodb_flush_log_at_trx_commit
可設為2(犧牲少量數據安全性換取更高性能,適用于對數據一致性要求不高的場景)。max_connections
設置為500-1000(根據應用并發需求調整),避免過多連接導致內存耗盡;同時設置thread_cache_size
=8-16,緩存空閑線程,減少線程創建開銷。query_cache_size
設置為64M-256M(僅適用于讀多寫少場景),query_cache_type
=1(啟用查詢緩存),緩存查詢結果以提高重復查詢速度。tmp_table_size
=max_heap_table_size
=64M-256M,增大臨時表大小,避免大查詢因臨時表溢出到磁盤而變慢;sort_buffer_size
=4M-8M、read_buffer_size
=4M-8M,優化排序和讀取操作。3. 索引優化
WHERE
、JOIN
、ORDER BY
子句中的列創建索引(如主鍵、唯一索引、普通索引),加速數據檢索。(user_id, create_time)
),遵循最左前綴原則(查詢條件需包含索引左側列)。SHOW INDEX FROM table_name
檢查并刪除未使用的索引。4. 查詢語句優化
EXPLAIN SELECT ...
查看查詢計劃,識別全表掃描、未使用索引等問題,針對性優化SQL。SELECT id, name FROM users
),減少數據傳輸量和內存占用。INNER JOIN
代替LEFT JOIN
/RIGHT JOIN
,減少不必要的行匹配;確保JOIN字段有索引。LIMIT 10000, 10
),使用WHERE id > last_id LIMIT 10
(基于上一頁最后一條記錄的ID),避免OFFSET
的大偏移量掃描。5. 定期維護操作
OPTIMIZE TABLE table_name
(適用于MyISAM和InnoDB表),重組表數據和索引,減少碎片占用。binlog
,通過expire_logs_days
設置過期天數)和慢查詢日志(slow_query_log
,定期歸檔),釋放磁盤空間。ANALYZE TABLE table_name
更新表的統計信息,幫助優化器生成更優的執行計劃。6. 工具輔助調優
mysqltuner
(sudo yum install mysqltuner
),運行后可生成詳細的性能報告,包括內存分配建議、索引使用情況、查詢緩存命中率等,幫助定位優化點。slow_query_log=1
、slow_query_log_file=/var/log/mysql/slow-queries.log
、long_query_time=2
),使用mysqldumpslow
或pt-query-digest
工具分析慢查詢,針對性優化。Prometheus+Grafana
、Zabbix
或MariaDB Monitor
監控數據庫性能指標(如QPS、TPS、連接數、緩存命中率),實時掌握數據庫狀態。