首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 數據減肥五法:NOT NULL、精準類型、前綴索引、定長優勢、分表

     編輯:MySQL 資料庫相關知識

「表越小、查越快」是鐵律。從列定義、索引設計、表結構三個維度實施數據減肥,提升 IO 與緩存效率。

法一:拒絕 NULL,預設值替代

  • NULL 實際佔 1 位標記位 + 可能阻礙優化器判斷
  • 盡量 NOT NULL DEFAULT 'default_val'
  • 薪資系統:工齡默認 0 而非 NULL
  • 真正需要「未知」語義時才用 NULL

法二:類型剛好夠用

場景推薦類型節省
整數範圍小TINYINT/SMALLINT/MEDIUMINTvs INT 節省 25-50%
固定長度代碼CHAR(n) / VARCHAR(n) 精確 n避免預留冗余
枚舉狀態ENUM('a','b','c')1-2 字節 vs 字符串
IP 地址INT UNSIGNED + INET_ATON4 字節 vs 15 字節

精確長度兼具數據校驗作用(超長自動報錯)。

法三:索引瘦身策略

  • 主鍵短小精悍:業務主鍵優於 UUID,自增 INT/BIGINT 最佳
  • 前綴索引:列值前綴唯一性高時,INDEX idx_name (col(10)) 只索引前 10 字符
  • 單列組合索引:高頻查詢組合建一個聯合索引,避免多單列索引
  • 索引選擇性:COUNT(DISTINCT col)/COUNT(*) 越接近 1 越適合建索引

法四:該定長時定長(MyISAM 表無變長列)

  • CHAR 定長:浪費空間換取固定偏移量 → 讀取定位快、無碎片
  • VARCHAR 變長:節省空間但需額外 1-2 字節長度前綴、易產生碎片
  • 無任何 VARCHAR/TEXT/BLOB 列的表 → 全用定長類型

法五:大表拆分(垂直/水平)

  • 垂直拆分:熱/冷列分離、大字段(TEXT/BLOB)獨立表
  • 水平拆分:按時間/租戶/哈希分表,單表控制在 2000 萬行以內
  • 歸檔表:歷史數據移至歸檔庫,主表只保留熱數據

拆分規則設計直接決定查詢路由複雜度,需結合業務訪問模式。

避坑提醒

  • 過度優化導致 JOIN 激增、應用邏輯複雜化
  • InnoDB 頁面壓縮(ROW_FORMAT=COMPRESSED)需 CPU 換 IO,評估權衡
  • 監控指標:Data_free(碎片)、Index_length/Data_length 比值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved