數據庫優化非單點調參,而是「系統理解 → 瓶頸定位 → 針對性優化」的系統工程。最關鍵因素是基礎架構設計(表結構、索引、分區、分庫分表),其次才是參數調優。
| 瓶頸類型 | 特徵指標 | 優化方向 |
|---|---|---|
| 磁盤搜尋 | iowait 高、隨機 IOPS 達上限、查詢響應時間波動大 | 數據分庫分表分盤、SSD/NVMe、增加內存減少落盤、覆蓋索引減少回表 |
| 磁盤讀寫吞吐 | 順序讀寫帶寬飽和、binlog/redo log 寫入延遲 | 多盤並行(RAID 10)、壓縮、調整 innodb_flush_log_at_trx_commit、組提交 |
| CPU 週期 | sys% 高、複雜計算/排序/正則/JSON 操作佔用 | 下推計算到應用層、簡化查詢、避免 SELECT *、合理使用存儲過程/UDF |
| 內存帶寬 | 大表全掃描、緩存未命中率高、大事務內存分配 | 增加緩存命中率、分區裁剪、調整 innodb_buffer_pool_size、避免大事務 |
MyISAM 採用表級鎖:多讀單寫,長時間 SELECT 會阻塞 INSERT/UPDATE/DELETE。
對策:核心業務表遷移至 InnoDB(行鎖、MVCC);唯讀/歸檔表可保留 MyISAM/Archive。
sql_mode=STRICT_TRANS_TABLES,STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE 強制報錯,將數據質量前置到寫入環節。REPLACE INTO、INSERT IGNORE、LIMIT n,m 分頁),使用 ANSI SQL 92/99 標準寫法。/*! ... */ 條件註釋:MySQL 執行,其他庫視為註釋忽略,可用於特定優化 Hint(如 /*! MAX_EXECUTION_TIME(1000) */)。複雜 GRANT(表級、列級權限、資源限制)會增加每次查詢的權限檢查開銷。
建議:生產環境僅使用庫級/全局權限,避免 tables_priv、columns_priv、user_resources 表被讀取。
SELECT BENCHMARK(1000000, MD5('test_string'));
-- 測試 MD5 百萬次調用耗時,用於函數/表達式性能對比
適用於函數選型(如 UUID() vs MD5(RAND()))、表達式優化驗證。
type(目標 ref/range/eq_ref)、key(實際用到的索引)、rows(預估掃描行)、Extra(Using index/Using where/Using temporary/Using filesort)。SELECT a,b FROM t WHERE c=1 → 索引 (c,a,b) 避免回表。WHERE varchar_col = 123 導致全表掃描,統一類型或顯式 CAST。LIMIT 100000,20 改為延遲關聯 SELECT * FROM t INNER JOIN (SELECT id FROM t WHERE cond LIMIT 100000,20) tmp USING(id)。EXPLAIN 預估行數近似值。| 優先級 | 參數 | 建議值/原則 |
|---|---|---|
| P0 | innodb_buffer_pool_size | 專用 DB 服務器物理內存 60-80% |
| P0 | innodb_log_file_size | 1-4GB,配合 innodb_log_files_in_group=2,減少 checkpoint 刷盤壓力 |
| P0 | innodb_flush_log_at_trx_commit | 1(雙1安全,數據零丟失);極致性能可設 2,風險自負 |
| P0 | sync_binlog | 1(配合上項雙1) |
| P1 | innodb_file_per_table | ON(獨立表空間,便於回收空間、傳輸表) |
| P1 | innodb_read_io_threads / write_io_threads | 4-16,根據 CPU 核心數與磁盤能力調整 |
| P1 | max_connections | 應用連接池峰值 + 100 預留,避免「Too many connections」 |
| P2 | query_cache_type / size | 5.7+ 已廢棄,8.0 移除,勿用 |
long_query_time=0.5(微秒級),配合 pt-query-digest 定期分析 TOP 慢查詢。ANALYZE TABLE 更新統計信息(5.6+ 自動統計觸發機制已改進,但大表變更後建議手動觸發)。gh-ost/pt-online-schema-change 在線 DDL,避免鎖表阻塞業務。