Mysql

Mysql wrt 中的行大小限制為 TEXT 和 BLOB 列

  • January 7, 2022

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,它是指內部的東西;它與使用者無關*。*

TEXTBLOB列基於和數據儲存“記錄”或“記錄外”(又名“溢出”)ROW_FORMAT

  • <= 40 字節的 TEXT/BLOB,它儲存在記錄中。
  • 中型列根據其總大小儲存在記錄內或記錄外。
  • 實際字元串前面有一個 2 字節長度欄位。
  • 大值:COMPACT 將儲存長列的前 768 個字節儲存在記錄中。DYNAMIC 使用 20 個字節來“指向”非記錄。
  • 壓縮 = 動態 + 壓縮。注意:壓縮塊往往是“真實”塊大小的一半。
  • (此討論不完整。)

如果您不需要所有大列,請不要使用SELECT *; 相反,指定所需的列。這避免了非記錄磁碟命中。

(我沒有聽說過你提到的 9/12 事件。)

引用自:https://dba.stackexchange.com/questions/267138