Mysql中的大文本類型
CHAR(n) 固定長度 ,最多 255 個字符 ;
VARCHAR(n) 可變長度,MySQL 4.1 及以前最大 255 字符,MySQL 5 之后最大 65535 字節 ;
TINYTEXT 可變長度,最多 255 個字符 ;
TEXT 可變長度
一個BLOB或TEXT列,最大長度為65535(2^16-1)個字符。
MEDIUMTEXT 可變長度
一個BLOB或TEXT列,最大長度為16777215(2^24-1)個字符。
LONGTEXT 可變長度
一個BLOB或TEXT列,最大長度為4294967295(2^32-1)個字符(4G)。
大文本字段是否有必要拆分成獨立表
一般來說,將TEXT字段,從一張操作頻繁的表中拆分出去,成為一個Key-Value結構的獨立表是 好處頗多的。
注:如查詢性能要求不是特別高且大文本字段只有單個或文本大小並沒有很大則無需考慮拆分為主次表。
其有利之處主要體現在下面三個方面:
PS:以下的討論對象均基於Innodb引擎
1. 便於運維
由於目前Innodb-plugin對於大多數DDL都是會有TABLE-LOCK的。這也就意味着,一張表的DDL時間越長,業務的不可訪問時間也就越長。
而決定一條DDL命令執行時長的兩個關鍵因素就是:表行數,表物理文件大小。
TEXT字段的拆分獨立,能夠很有效的減小主表的物理文件大小。
由此不難看出一張對於業務十分重要或者訪問非常頻繁的表來說,這樣的拆分是能夠極大程度上降低運維成本的。
2. 便於緩存方案、數據產品的遷移實施
Key-大體積Value的數據類型對於MySQL來說本來就不是一個強項。
將TEXT拆分成K-V這樣簡單結構的表后,很方便就能通過改動較少的代碼,實現數據產品的遷移。
無論是Mongo的 _id: value 、redis 的string 、還是memcached的key - value 都可以很輕松的導入數據。
此外,拋開緩存方案不說,光基於節省MySQL磁盤空間的考慮,也可以對於拆分后的獨立表單獨配置 row-format = compressed 的innodb壓縮參數。減小物理文件體積,同時也增多了單個數據頁能夠存放的內容,一定程度上的提升了QPS。
3. 提高查詢性能
上文提到了,拆分后添加壓縮選項后,K-V表的QPS會較之前有提升。
除此之外,這種方案對於 Antelope文件格式的主表查詢性能也會有提升(Barracuda文件格式則沒有區別)。
由於Antelope的 Compact和Redundant文件格式,對於長字段都會將其最左的786個字節內容保存在Primary Key的數據頁中。
而Barracuda 的文件格式,對於TEXT字段,都會將其全部內容存放在off-page中,而Primary Key的數據頁中只存放一個20字節的指針。
拆分對於前者可以節省786B的數據頁空間,而后者只有20B的空間。這也就是為什么,前者的性能提升會更大。
參考文章:
https://www.cnblogs.com/fanblogs/p/11221656.html
https://blog.csdn.net/weixin_35920379/article/details/113215061