為 VARCHAR 欄位加前綴索引能大幅加速查詢,但寫入代價往往被忽視。本文通過億級表實測,量化索引維護對 UPDATE 的衝擊,並探討垂直拆表優化思路。
tbl_name:億級行數platforms VARCHAR(255),加前綴索引 platforms(8)| 場景 | 耗時 | 備註 |
|---|---|---|
| 無索引 | 約 4 小時 | 基準線 |
| 加前綴索引後 | 近 9 小時 | 效能下降 125% |
代碼片段:
-- 加索引
ALTER TABLE tbl_name ADD INDEX platforms_index(platforms(8));
-- 更新腳本
for idx in range(1, count+1):
sql = "UPDATE tbl_name SET platforms='"+datetime.now().strftime('%Y%m%d%H%M%S%f')+"' WHERE id="+str(idx)+";"
cursor.execute(sql)
UPDATE 流程:
字符串索引維護開銷大:
- 變長列需計算前綴哈希
- 頻繁頁分裂/合併
- 佔用更多緩衝池與磁盤 I/O
將高頻更新的長字符串拆到獨立表:
-- 主表
CREATE TABLE main_tbl (
id BIGINT PRIMARY KEY,
-- 其他高頻讀寫欄位
platform_id INT
);
-- 字符串表(去重後極小)
CREATE TABLE platform_dim (
platform_id INT PRIMARY KEY,
platforms VARCHAR(255),
UNIQUE KEY uk_platforms (platforms)
);
更新時僅修改 platform_dim 一行,或插入新值再更新映射。若重複率高,字符串表極小,索引維護成本近乎為零。
索引是把雙刃劍。讀多寫少加索引,寫多讀少慎加索引,長字符串高頻更新優先考慮垂直拆表或外部存儲(如對象存儲+引用)。