最近不止一次的被問及這么一個問題:
一個含有TEXT字段的寬表,是否有必要把TEXT拆分出去作為一個獨立的表,來提高性能?
下面談談我個人的看法:一般來說,將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的空間。這也就是為什么,前者的性能提升會更大