語法:
SELECT * FROM tbl_name PROCEDURE ANALYSE();
SELECT * FROM tbl_name PROCEDURE ANALYSE(16, 256); -- 忽略 >16 值或 >256 字節的 ENUM 建議
mysql> SELECT * FROM statistics_news_category_history PROCEDURE ANALYSE(9,256)\G
*************************** 1. row ***************************
Field_name: datacrawldb.statistics_news_category_history.id
Min_value: 26
Max_value: 30
Min_length: 2
Max_length: 2
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 28.0000
Std: 1.4142
Optimal_fieldtype: TINYINT(2) UNSIGNED NOT NULL -- 建議:原 INT(10) → TINYINT
*************************** 2. row ***************************
Field_name: ...news_category
Min_value: bigdata
Max_value: test
Min_length: 4
Max_length: 10
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 6.6000
Std: NULL
Optimal_fieldtype: ENUM('bigdata','cloud','datacenter','storage','test') NOT NULL -- 建議:VARCHAR(20) → ENUM
*************************** 3. row ***************************
Field_name: ...news_num
Optimal_fieldtype: TINYINT(2) UNSIGNED NOT NULL -- 原 INT(10)
*************************** 4. row ***************************
Field_name: ...news_date
Optimal_fieldtype: ENUM('2014-02-17') NOT NULL -- 原 VARCHAR(10) 存日期
ALTER TABLE statistics_news_category_history
MODIFY id TINYINT(2) UNSIGNED NOT NULL AUTO_INCREMENT,
MODIFY news_category ENUM('bigdata','cloud','datacenter','storage','test') NOT NULL,
MODIFY news_num TINYINT(2) UNSIGNED NOT NULL,
MODIFY news_date ENUM('2014-02-17') NOT NULL;
| # | 技巧 | 收益 |
|---|---|---|
| 1 | 用正確類型,勿將數字存為字符串 | 空間 -90%,比較快 10x |
| 2 | 選最小足夠類型:MEDIUMINT < INT < BIGINT | MEDIUMINT 比 INT 省 25% 空間 |
| 3 | 盡量 NOT NULL | 每列省 1 bit,索引更緊湊,查詢更快 |
| 4 | MyISAM 固定長度行(無 VARCHAR/TEXT/BLOB) | 讀取速度提升 20%~30% |
| 5 | 非多語言列用 latin1 而非 utf8 | utf8 佔 3 倍空間(email、URL、IP 等) |
| 6 | ROW_FORMAT=FIXED 強制固定長度 | 兼容 VARCHAR 同時享受固定行優勢 |
ENUM 修改值需 ALTER TABLE,高頻變更業務慎用;TINYINT 範圍 -128~127(無符號 0~255),確認業務上限;ALTER TABLE 鎖表時間,再主庫執行。