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

MySQL MyISAM 單表突破 4GB 限制:MAX_ROWS 與 AVG_ROW_LENGTH 實戰詳解

     編輯:MySQL 資料庫相關知識

問題現象

MyISAM 表寫入報錯:The table is full。資料檔(.MYD)接近 4GB(4,294,967,296 bytes),實際為 4,294,963,640 bytes。

根本原因

MyISAM 預設使用 32 位元檔案指標(Datafile pointer = 4 bytes),最大可定址 4GB。myisamchk -dv 顯示 Max datafile length: 4294967296。

解決方案:ALTER TABLE 重設指標大小

ALTER TABLE cdb_posts 
MAX_ROWS=1000000000 
AVG_ROW_LENGTH=15000;

參數含義

  • MAX_ROWS:預估最大行數,MyISAM 据此計算所需指標位元數(4/6/8 bytes)。
  • AVG_ROW_LENGTH:預估平均行長(bytes),輔助計算總空間需求。

設定極大值強制 MyISAM 升級為 64 位元指標(8 bytes),理論支援 256TB(實際受限於檔案系統)。

實戰驗證

  1. 執行 ALTER(大表耗時,雙 Athlon 30 分鐘)。
  2. 再次檢查:myisamchk -dv cdb_posts
Max datafile length: 281474976710654  # 256 TB
Max keyfile length: 4398046510079     # 4 TB (索引仍為 4GB 指標)

資料檔限制成功突破,索引檔仍受 4GB 限制(極少觸及)。

原理圖解

類比:日記本目錄原用 1 字節編頁(0-9),頁數超過 10 目錄失效。ALTER 告知「本子有 10 億頁,每頁 1.5 萬字」,MyISAM 配置 8 字節目錄指標,完美定址。

副作用與成本

  • 索引檔(.MYI)微增(約 1MB),可忽略。
  • ALTER 過程鎖表、重建檔案,需維護窗口操作。
  • 不適用於 InnoDB(InnoDB 表空間無 4GB 限制)。

適用場景與替代方案

場景建議方案
MyISAM 歷史大表,暫不遷移ALTER TABLE MAX_ROWS/AVG_ROW_LENGTH
新專案/可遷移直接用 InnoDB(支援 64TB 表空間、Crash Safe)
需全文搜尋(MyISAM 優勢)MySQL 5.6+ InnoDB Fulltext 可替代
唯讀歸檔大表壓縮表 myisampack + 突破 4GB

檔案系統前提

  • EXT3/EXT4/XFS/ZFS 單檔支援 > 4GB(EXT2 僅 2GB)。
  • 確認 df -T、ulimit -f unlimited。

一條 ALTER 指令,徹底解決 MyISAM 4GB 瓶頸,為歷史系統爭取遷移時間窗口。

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