本文匯總了 MySQL 生產環境中的核心優化經驗,涵蓋存儲引擎選擇、數據類型最佳實踐、索引設計原則、分區表策略、命名規範、字段設計、SQL 編寫規範及事務管理等關鍵維度,為開發者和 DBA 提供系統性優化指導。
.MYD(數據)和 .MYI(索引)兩個文件。NOT NULL。NULL 的代價: 浪費存儲空間(InnoDB 需額外字節)、導致復合索引失效、優化器難以優化(索引統計、值比較更複雜)、MyISAM 中可能導致固定大小索引變為可變大小。| 類型 | 範圍 | 存儲 | 適用場景 |
|---|---|---|---|
DATE | 1000-01-01 至 9999-12-31 | 3 字節 | 僅需日期(年月日) |
DATETIME | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | 8 字節 | 需日期時間,范圍大,不受時區影響 |
TIMESTAMP | 1970-01-01 00:00:01 UTC 至 2038-01-19 03:14:07 UTC | 4 字節 | 需時區感知、自動初始化/更新、空間敏感 |
自動初始化/更新示例:
CREATE TABLE aaa (
id bigint(11) NOT NULL AUTO_INCREMENT,
ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
dt datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
name varchar(20) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
AUTO_INCREMENT,是最佳主鍵選擇。MD5()、SHA1()、UUID() 生成的值任意分布在大空間,導致:
UNHEX() 轉為 16 字節二進制存入 BINARY(16),讀取時用 HEX() 格式化。注意:UUID() 有部分順序性,優於純隨機哈希,但仍不如遞增整數。避免全表掃描,從根節點搜索。注意: B+Tree 索引只能定位到數據頁,再由內存中查找具體行。
三大限制(最左前綴原理):
基於哈希表實現,僅支持精確匹配(=、IN),不支持範圍查詢和排序。Memory 引擎默認使用。
UTF8,存 emoji 用 UTF8MB4(MySQL 5.5.3+)InnoDBVARCHAR/VARBINARY冗余索引示例: idx_abc(a,b,c) 存在時,idx_a(a) 和 idx_ab(a,b) 即為冗余。
隱式轉換陷阱: VARCHAR 字段傳入 INT 值導致全表掃描。應用層必須做類型檢查。
NOT NULL,除非確需存 NULLUNSIGNEDDATETIMEVARCHAR(注意 M 為字符數非字節數)UNSIGNED INT 存儲(INET_ATON()/INET_NTOA() 轉換),不支持 IPv6DECIMAL,慎用 FLOATBLOB/TEXTINSERT ... VALUES (),(),()),減少交互UPDATE/DELETE 不用 LIMIT(易主從不一致)SELECT *COUNT(*)%(%xxx 不走索引)OR 改 IN():OR 是 N 級,IN 是 log(N) 級,IN 值建議 ≤ 200OR 改 UNION:MySQL 索引合併弱,phone='159' OR name='john' 改為兩條 SELECT 做 UNIONLIMIT 10000,10 → WHERE id > 10000 LIMIT 10(需主鍵/唯一索引有序)UNION ALL 替代 UNION(無去重開銷)LOAD DATA(比 INSERT 快 ~20 倍)MySQL 優化是系統工程,需從引擎選型、類型設計、索引策略、表結構規範、SQL 編寫習慣、事務管理等多維度協同。核心思想:簡單、小巧、規範、業務邏輯下沉。堅持執行上述規範,配合監控與慢查詢分析,可構建高性能、高可用、易維護的 MySQL 系統。