Mysql
Mysql wrt 中的行大小限制為 TEXT 和 BLOB 列
Mysql 中有一個眾所周知的限制,即行大小為 65,535 字節。在瀏覽文件時,
我發現
BLOB 和 TEXT 列僅對行大小限制貢獻 9 到 12 個字節,因為它們的內容與行的其餘部分分開儲存。
我確實瀏覽了 MySQL 文件,但無法理解 TEXT 列何時會貢獻 9 個字節以及何時會貢獻 12 個字節。誰能解釋如何解釋該聲明?
它還儲存數據的長度,這就是為什麼它是 9 - 12 ,如果你想要的話。
https://github.com/jeremycole/mysql/blob/master/storage/innobase/include/btr0cur.h#L762
/** The reference in a field for which data is stored on a different page. The reference is at the end of the 'locally' stored part of the field. 'Locally' means storage in the index record. We store locally a long enough prefix of each column so that we can determine the ordering parts of each index record without looking into the externally stored part. */ /*-------------------------------------- @{ */ #define BTR_EXTERN_SPACE_ID 0 /*!< space id where stored */ #define BTR_EXTERN_PAGE_NO 4 /*!< page no where stored */ #define BTR_EXTERN_OFFSET 8 /*!< offset of BLOB header on that page */ #define BTR_EXTERN_LEN 12 /*!< 8 bytes containing the length of the externally stored part of the BLOB. The 2 highest bits are reserved to the flags below. */ /*-------------------------------------- @} */
行格式還有其他復雜性。
討論的是 InnoDB;MyISAM 的工作方式不同。
InnoDB 有 4 個
ROW_FORMATs
. 如果你想要一些靈活性,你可能應該看看那些。InnoDB 的一般規則是關注行的儲存位置和方式。在這裡,限制大約是 8KB;更具體地說,略小於塊大小的一半(預設 = 16KB)。這個限制覆蓋了 64KB,它是指內部的東西;它與使用者無關*。*
TEXT
和BLOB
列基於和數據儲存“記錄”或“記錄外”(又名“溢出”)ROW_FORMAT
:
- <= 40 字節的 TEXT/BLOB,它儲存在記錄中。
- 中型列根據其總大小儲存在記錄內或記錄外。
- 實際字元串前面有一個 2 字節長度欄位。
- 大值:COMPACT 將儲存長列的前 768 個字節儲存在記錄中。DYNAMIC 使用 20 個字節來“指向”非記錄。
- 壓縮 = 動態 + 壓縮。注意:壓縮塊往往是“真實”塊大小的一半。
- (此討論不完整。)
如果您不需要所有大列,請不要使用
SELECT *
; 相反,指定所需的列。這避免了非記錄磁碟命中。(我沒有聽說過你提到的 9/12 事件。)