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

MySQL BLOB 類型完整指南:大小選擇與配置調優

     編輯:MySQL 資料庫相關知識

什麼是 BLOB?

BLOB (Binary Large Object) 用於儲存二進制大物件:圖片、音訊、文件等。資料庫僅負責存取,不解析內容。

雙刃劍警示: 大量/大型 BLOB 會嚴重影響資料庫效能 (緩衝池污染、備份緩慢、複制延遲)。生產環境強烈建議:檔案存對象儲存 (S3/MinIO),資料庫只存路徑/元數據。

MySQL 四種 BLOB 型別對照

類型最大儲存量適用場景儲存開銷
TINYBLOB255 Bytes極小二進制片段1 Byte 長度前綴
BLOB64 KB小圖示、縮圖2 Bytes 長度前綴
MEDIUMBLOB16 MB一般文件、照片3 Bytes 長度前綴
LONGBLOB4 GB大型媒體檔案4 Bytes 長度前綴

關鍵配置參數:max_allowed_packet

控制單次網路封包/語句最大長度,必須大於最大 BLOB 大小。

配置位置

[mysqld]
max_allowed_packet = 64M  # 建議設為 64M 或更大

[mysqldump]
max_allowed_packet = 64M  # 備份工具獨立配置

動態調整 (無需重啟)

SET GLOBAL max_allowed_packet = 67108864;  -- 64M
SHOW VARIABLES LIKE 'max_allowed_packet';

實務操作範例

建表

CREATE TABLE documents (
  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  filename VARCHAR(255) NOT NULL,
  mime_type VARCHAR(100),
  content MEDIUMBLOB,  -- 16MB 足多數文件
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

插入資料 (MySQL 命令列)

-- 使用 LOAD_FILE (需 FILE 權限、檔案在 Server 端)
INSERT INTO documents (filename, mime_type, content)
VALUES ('report.pdf', 'application/pdf', LOAD_FILE('/data/report.pdf'));

應用層插入 (PHP PDO 範例)

$stmt = $pdo->prepare("INSERT INTO documents (filename, mime_type, content) VALUES (?, ?, ?)");
$stmt->bindParam(1, $filename);
$stmt->bindParam(2, $mime);
$stmt->bindParam(3, $blob, PDO::PARAM_LOB);  -- 關鍵:PARAM_LOB
$stmt->execute();

效能優化建議

  1. 拆分表: 將 BLOB 欄位移至獨立表 (垂直分表),主表只保留元數據
  2. 啟用壓縮: InnoDB COMPRESSED 行格式 + innodb_compression_level
  3. 限制大小: 應用層驗證檔案大小,拒絕超限上傳
  4. 串流讀寫: 使用 mysqli_stmt_send_long_data() 分塊傳輸,避免記憶體飆升

遷移建議:從 BLOB 到對象儲存

-- 階段 1:新增路徑欄位
ALTER TABLE documents ADD COLUMN storage_path VARCHAR(500);

-- 階段 2:應用雙寫 (資料庫 + S3)
-- 階段 3:歷史資料遷移腳本
-- 階段 4:切換讀取至 S3,資料庫僅存路徑
-- 階段 5:清理 BLOB 欄位 (ALTER TABLE ... DROP COLUMN content)

合理選擇 BLOB 類型、調整 max_allowed_packet、評估對象儲存替代方案,是處理二進制資料的三大關鍵決策。

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