MySQL 優化是一項系統工程,涵蓋表設計、索引策略、分表拆分、讀寫分離、存儲過程、參數調優、硬體升級、日常維護及 SQL 改寫等多個維度。本文結合實戰經驗,梳理出一套可落地的優化體系。
| 維度 | 關鍵動作 | 說明 |
|---|---|---|
| 表設計 | 符合 3NF、字段類型最小化、避免 NULL | 減少存儲空間,提升索引效率 |
| 索引策略 | 普通、主鍵、唯一、全文索引合理選用 | 覆蓋索引、最左前綴、避免過度索引 |
| 分表技術 | 水平分割(分庫分表)、垂直分割(大字段拆分) | 單表控制在 2000 萬行以內 |
| 讀寫分離 | 主寫從讀、中間件代理 | 緩解主庫壓力,提升並發吞吐 |
| 存儲過程 | 模組化編程、減少網絡往返 | 適合高頻、複雜業務邏輯 |
| 參數調優 | max_connections、innodb_buffer_pool_size、query_cache 等 | 根據負載基準測試動態調整 |
| 硬體升級 | SSD、大內存、多核 CPU、RAID 10 | I/O 瓶頸首選方案 |
| 日常維護 | 定時清理歷史數據、MyISAM 碎片整理 | 保持統計信息準確 |
| SQL 改寫 | EXPLAIN 分析、避免 SELECT *、優化 JOIN 順序 | 解決 80% 以上的慢查詢 |
-- 查看數據庫
SHOW DATABASES;
-- 切換數據庫
USE test;
-- 查看表
SHOW TABLES;
-- 查看建表語句
SHOW CREATE TABLE grade;
-- 查看表結構
DESC student;
-- 查看存儲引擎
SHOW ENGINES;
SHOW ENGINES\G;
-- 查看默認存儲引擎
SHOW VARIABLES LIKE 'storage_engine';
-- 修改字段類型
ALTER TABLE grade MODIFY course VARCHAR(20);
-- 修改字段位置
ALTER TABLE grade MODIFY s_num INT(10) AFTER id;
-- 重命名字段
ALTER TABLE grade CHANGE grade score VARCHAR(10);
-- 刪除外鍵
ALTER TABLE grade DROP FOREIGN KEY grade_fk;
-- 修改存儲引擎
ALTER TABLE grade ENGINE=InnoDB;
-- 刪除字段
ALTER TABLE student DROP address;
-- 新增字段
ALTER TABLE student ADD phone INT(10);
-- 重命名表
ALTER TABLE grade RENAME gradeinfo;
-- 刪除表
DROP TABLE student;
不同存儲引擎的索引存儲方式差異巨大:
索引代價:佔用磁碟空間、降低寫入性能(INSERT/UPDATE/DELETE 需同步維護索引)。
設計建議:關聯查詢字段長度保持一致,減少隱式轉換與匹配次數。
CREATE INDEX idx_typeid ON book1(typeid);type、key、rows、Extra 欄位。innodb_buffer_pool_size、sort_buffer_size、join_buffer_size 等。MySQL 優化無銀彈,關鍵在於「監控 → 定位 → 驗證 → 固化」的閉環迭代。建議建立基準測試環境,每次變更後對比 QPS、RT、CPU、I/O 指標,數據驅動決策。