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

MySQL 查詢優化核心系列:數據類型選擇與儲存效率深度解析

     編輯:MySQL 資料庫相關知識

核心原則:越小越快、越簡單越快

選擇數據類型時,在滿足業務範圍前提下,優先選用佔用空間最小、處理最簡單的類型。這不僅減少磁碟 I/O,更能縮小索引體積、加快 CPU 運算、提升緩衝區命中率。

具體策略

1. 整數類型:剛好夠用即可

  • 業務最大值 < 255 → TINYINT UNSIGNED (1 byte)
  • < 65,535 → SMALLINT UNSIGNED (2 bytes)
  • < 42 億 → INT UNSIGNED (4 bytes)
  • 避免盲目用 BIGINT (8 bytes) 作主鍵,除非真有百億級行數。

2. 字串類型:CHAR vs VARCHAR 的權衡

引擎建議理由
MyISAM固定長度優先(CHAR)固定行長 → 位移計算 O(1)、無碎片、崩潰恢復快。代價:佔空間(尾部補空格)。
InnoDB變長優先(VARCHAR)行格式統一用指標指向資料,CHAR 平均佔更多空間 → 增加 I/O。VARCHAR 節省空間更划算。
MEMORY無差異全轉為固定長度處理,CHAR/VARCHAR 同樣佔定長空間。
BDB實測為準差異極小,建議實際壓測決定。

例外:CHAR 最大 255 字元,超過必須用 VARCHAR 或 TEXT。

3. 明確宣告 NOT NULL

  • 省去 NULL 判斷邏輯,簡化優化器決策。
  • 節省 1 bit(MyISAM)或額外位元組(InnoDB)標記空間。
  • 允許優化器將 WHERE col = 'val' 直接轉為範圍查詢,無需額外 IS NOT NULL 檢查。

4. 低基數欄位用 ENUM

狀態碼、性別、類型等「值集合固定、基數極低」的欄位,改為 ENUM 內部以整數儲存,比較/排序/索引極快。

5. 善用 PROCEDURE ANALYSE()

SELECT * FROM tbl_name PROCEDURE ANALYSE(16, 256);

輸出每欄的建議類型(含 ENUM 建議值集合)。第二參數限制 ENUM 最大值數/長度,避免輸出過長。

碎片整理與維護

  • 變長行表(含 VARCHAR/BLOB/TEXT)頻繁 UPDATE/DELETE 會產生碎片 → 定期 OPTIMIZE TABLE(MyISAM/BDB 支援,InnoDB 重建表)。
  • 通用重建法(全引擎適用):
    mysqldump --opt db tbl > dump.sql && mysql db < dump.sql

大物件(BLOB/TEXT)處理策略

  1. 應用層壓縮後存入:一次讀取即得完整資訊,減少往返。適合結構變動大、半結構化資料(如 XML/JSON)。
  2. 合成索引(雜湊指紋):對 BLOB/TEXT 計算 MD5()/SHA1()/CRC32() 存入獨立 BINARY(16/20/4) 欄位並建索引。查詢時先匹配雜湊值(精確匹配極快),再回表取大物件。不適用範圍查詢。
  3. 垂直拆表:將 BLOB/TEXT 移至獨立表,主表保持固定行長 → 享受固定行優勢、SELECT * 不拖大物件。
  4. 避免無謂 SELECT *:只在 WHERE 精確鎖定少量行時才讀取大物件欄位。

高效載入大量資料

策略原理適用場景
LOAD DATA INFILE批量載入、單次解析、索引延遲刷新首選,速度最快
LOAD DATA 無 LOCAL伺服器端直接讀檔,省網路傳輸檔案已在伺服器、有 FILE 權限
多值 INSERTINSERT INTO t VALUES (...),(...),...; 減少解析與索引刷新次數必須用 INSERT 時
事務/鎖表批次提交InnoDB:START TRANSACTION...COMMIT;MyISAM:LOCK TABLES WRITE...UNLOCK TABLES大量 INSERT 合併索引刷新
DELAYED_KEY_WRITEMyISAM 索引緩衝區延遲刷新大量寫入、可容忍崩潰修復
壓縮協定 --compress減少網路傳輸量慢速網路、大量資料
省略預設值欄位SQL 更短、解析更少所有 INSERT
新表先建無索引 → 載入 → 建索引一次建索引比逐行維護快數量級MyISAM 大量初始化
既有表 DISABLE/ENABLE KEYS關閉/開啟非唯一索引更新MyISAM 大量追加

混合讀寫環境的應對

長時間 SELECT 阻塞寫入時,可採「輔助表」策略:寫入先入輔助表,定期批量合併至主表。優點:主表無鎖爭用、合併時索引只刷一次。缺點:新資料有延遲可見性。適用於 Web 存取日誌等非即時業務。

MyISAM 並發插入

若表無「中間空洞」(無 DELETE/UPDATE 縮短行),MyISAM 允許 INSERT 與 SELECT 同時進行,無需輔助表。啟用條件:concurrent_insert=1(預設)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved