MySQL 作為開源關係型數據庫的佼佼者,廣泛支撐着高併發業務系統。隨着數據量與訪問壓力指數級增長,如何將 MySQL 性能壓榨到極致,成為 DBA 與開發者的必修課。本文彙總 100 條實戰優化建議,涵蓋硬件選型、作業系統調優、實例配置、模式設計、查詢重寫、備份策略六大維度,助你構建高可用、高性能的數據庫體系。
vm.swappiness=0,杜絕內存頁換出。noatime,nodiratime 關閉訪問時間更新,減少元數據寫入。noop,機械盤用 deadline,禁用 cfq。innodb_flush_method=O_DIRECT:繞過 OS 頁緩存,消除雙緩衝。O_DIRECT + ext3 組合,會導致寫入序列化。innodb_buffer_pool_size 設為物理內存 60%-80%,熱數據全內存化。innodb_log_file_size 適中即可(如 1-4GB),過大延長崩潰恢復時間。innodb_thread_concurrency 與 thread_concurrency,二者互斥。max_connections 設合理上限(如 2000-5000),防止連接風暴 OOM。thread_cache_size ≥ 64,複用線程降低創建銷毀開銷。skip-name-resolve:跳過反向 DNS 解析,加速握手。query_cache_type=0),唯讀場景謹慎開啟。tmp_table_size/max_heap_table_size 同步調大(如 64MB),減少內臨時表落盤。sort_buffer_size 按需分配(256KB-2MB),避免並發排序耗盡內存。Key_read_requests / Key_reads 比率調整 key_buffer_size,MyISAM 專用。innodb_flush_log_at_trx_commit=1 保強一致,=2 高性能妥協,=0 風險自擔。VARCHAR 替代 CHAR(UTF8MB4 除外),節省存儲與網絡傳輸。utf8mb4,兼容 Emoji,排序規則 utf8mb4_0900_ai_ci。long_query_time=0 全采集)+ pt-query-digest 定期分析。EXPLAIN 讀懂執行計劃:type、key、rows、Extra 欄位是核心。COUNT(*) 全表掃描,改用計數表或近似值(SHOW TABLE STATUS)。GROUP BY 替代 DISTINCT,可利用索引有序性避免臨時表排序。USE INDEX/FORCE INDEX 干預優化器誤選。SQL_MODE=STRICT 暴露數據質量問題,杜絕截斷靜默發生。IN/EXISTS 選擇、UNION ALL 代替 OR。INSERT ... ON DUPLICATE KEY UPDATE 合併查詢與寫入,減少網絡往返。ORDER BY ... LIMIT 1 走索引,勿用 MAX() 全掃。ORDER BY RAND(),應用層隨機 ID 再主鍵回表。LIMIT M,N 深分頁性能劣化,改用延遲關聯或游標分頁。JOIN 或 UNION,MySQL 8.0+ CTE 更優雅。LOCK IN SHARE MODE/FOR UPDATE 精確控制並發。innodb_buffer_pool_dump_at_shutdown)。TRUNCATE TABLE 替代 DELETE 清空表,元數據操作秒級完成。SHOW PROCESSLIST/Performance Schema 實時捕捉阻塞鏈。STOP SLAVE,保證時間點一致性。mysqldump 必帶 --master-data=2 --single-transaction --routines --triggers。MySQL 優化無銀彈,唯有「觀測→分析→調優→驗證」的閉環實踐。將這 100 條軍規內化為肌肉記憶,配合監控體系與自動化工具,方能駕馭萬億級數據洪流,守護業務穩健前行。
