| 檢查點 | 優化原則 | 典型錯誤案例 |
|---|---|---|
| 字元集最小化 | Latin1 > GBK > UTF8/UTF8MB4 | 純 ASCII 業務用 UTF8MB4 |
| 索引濫用 | 僅建必要索引,利用前綴索引 | 狀態欄位(如 0/1)建索引、重複索引 |
| 冗餘欄位 | 正規化拆分,避免大字段重複 | 多表存相同 JSON/文本 |
| 欄位類型過大 | TINYINT > SMALLINT > INT > BIGINT | 枚舉值用 VARCHAR(20) |
| 主鍵選擇 | 自增 BIGINT,避免業務鍵/組合鍵 | UUID、長字串、複合主鍵 |
CREATE TABLE class_meta ( class_name VARCHAR(128) PRIMARY KEY, class_desc VARCHAR(2048), class_status CHAR(20) DEFAULT 'test1', UNIQUE KEY cm_cn_uk (class_name), -- 與 PK 重複 KEY cm_cd_ind (class_desc(767)), -- 描述欄位無需索引 KEY cm_cs_ind (class_status), -- 低基數欄位無效 KEY cm_cdcn_ind (class_desc(767),class_name) -- 與 cm_cd_ind 重複 ) ENGINE=InnoDB CHARSET=latin1;
問題:主鍵+唯一索引重複、低選擇性索引、大字段索引、主鍵非自增。
OPTIMIZE TABLE 整理碎片(InnoDB 實為 ALTER TABLE ... ENGINE=InnoDB)ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=85 億行表,單行從 100 字節降至 60 字節 → 節省 約 18 GB(未含索引)。「斤斤計較」在 TB/PB 級極具價值。