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

MySQL 欄位型別選擇對查詢效能的影響:定長 vs 變長、數值型別精度、ENUM 優化與 BLOB 隔離策略

     編輯:MySQL 資料庫相關知識

核心選型原則

原則說明效能影響
優先定長 (CHAR) 而非變長 (VARCHAR)頻繁更新表減少碎片、固定位移快速定位空間換時間,適合高頻寫入表
剛好夠用的長度CHAR(40) 而非 CHAR(255)減少 I/O、緩衝池佔用、排序暫存空間
優先數值型別MEDIUMINT 而非 BIGINT、DECIMAL(10,2) 而非 DOUBLE運算更快、索引更小、緩存更多行
NOT NULL 約束預設 NOT NULL,必要時才允許 NULL儲存省 1 bit、查詢無需 IS NULL 判斷、索引更緊湊
低基數離散值用 ENUM狀態、類型、性別等固定集合內部儲存為整數、比較極快、自帶約束

PROCEDURE ANALYSE() 智能建議

SELECT * FROM tbl PROCEDURE ANALYSE(16, 256);
# 建議最佳型別,限制 ENUM 最大值數 16、最大長度 256 字節

依據建議 ALTER TABLE 調整型別。

BLOB/TEXT 特殊處理策略

策略適用場景優缺點
單表 BLOB 欄位少量大物件、結構固定簡單,但大量 DELETE/UPDATE 產生碎片
合成索引 (MD5 雜湊值)精確匹配查詢 BLOB 內容MD5(blob_col) 存整數索引,查詢極快,不支援範圍查詢
垂直拆分:BLOB 獨立副表主表高頻查詢、BLOB 低頻讀取主表轉定長行、碎片隔離、JOIN 開銷
外部儲存 (S3/MinIO/檔案系統)超大物件、雲原生資料庫僅存 URI、元資料,徹底解耦

查詢時避免 SELECT * 搶佔頻寬

  • 明確列出所需欄位:SELECT id, name FROM articles WHERE id=123。
  • BLOB 欄位單獨查詢:SELECT content FROM article_blobs WHERE article_id=123。

碎片管理

  • OPTIMIZE TABLE 重建表、回收碎片、更新統計。
  • 頻率:高頻寫入表每日/每週,配合 pt-online-schema-change 線上執行。
  • InnoDB 5.6+:innodb_file_per_table + OPTIMIZE TABLE 實際執行 ALTER TABLE ... ENGINE=InnoDB 重建。

結語

欄位型別是查詢效能的基因。設計原則:定長優於變長、數值優於字串、剛好夠用、NOT NULL 預設、ENUM 低基數、BLOB 垂直拆分。配合 PROCEDURE ANALYSE 週期性審視、OPTIMIZE TABLE 碎片回收,構建高效能儲存基因。

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