TEXT字段是否有必要拆分成獨立表?


最近不止一次的被問及這么一個問題:

一個含有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的空間。這也就是為什么,前者的性能提升會更大

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM