共計 1926 個字符,預計需要花費 5 分鐘才能閱讀完成。
這篇文章主要介紹了如何優化 InnoDB 表 BLOB,TEXT 列的存儲效率,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。
首先,介紹下關于 MySQL InnoDB 引擎存儲格式的幾個要點:
1、InnoDB 可以選擇使用共享表空間或者是獨立表空間方式,建議使用獨立表空間,便于管理、維護。啟用 innodb_file_per_table 選項,5.5 以后可以在線動態修改生效,并且執行 ALTER TABLE xx ENGINE = InnoDB 將現有表轉成獨立表空間,早于 5.5 的版本,修改完這個選項后,需要重啟才能生效。
2、InnoDB 的 data page 默認 16KB,5.6 版本以后,新增選項 innodb_page_size 可以修改,在 5.6 以前的版本,只能修改源碼重新編譯,但并不推薦修改這個配置,除非你非常清楚它有什么優缺點。
3、InnoDB 的 data page 在有新數據寫入時,會預留 1 /16 的空間,預留出來的空間可用于后續的新紀錄寫入,減少頻繁的新增 data page 的開銷。
4、每個 data page,至少需要存儲 2 行記錄。因此理論上行記錄最大長度為 8KB,但事實上應該更小,因為還有一些 InnoDB 內部數據結構要存儲。
5、受限于 InnoDB 存儲方式,如果數據是順序寫入的話,最理想的情況下,data page 的填充率是 15/16,但一般沒辦法保證完全的順序寫入,因此,data page 的填充率一般是 1 / 2 到 15/16。因此每個 InnoDB 表都最好要有一個自增列作為主鍵,使得新紀錄寫入盡可能是順序的。
6、當 data page 填充率不足 1 / 2 時,InnoDB 會進行收縮,釋放空閑空間。
7、MySQL 5.6 版本的 InnoDB 引擎當前支持 COMPACT、REDUNDANT、DYNAMIC、COMPRESSED 四種格式,默認是 COMPACT 格式,COMPRESSED 用的很少且不推薦(見下一條),如果需要用到壓縮特性的話,可以直接考慮 TokuDB 引擎。
8、COMPACT 行格式相比 REDUNDANT,大概能節省 20% 的存儲空間,COMPRESSED 相比 COMPACT 大概能節省 50% 的存儲空間,但會導致 TPS 下降了 90%。因此強烈不推薦使用 COMPRESSED 行格式。
9、當行格式為 DYNAMIC 或 COMPRESSED 時,TEXT/BLOB 之類的長列(long column,也有可能是其他較長的列,不一定只有 TEXT/BLOB 類型,看具體情況)會完全存儲在一個獨立的 data page 里,聚集索引頁中只使用 20 字節的指針指向新的 page,這就是所謂的 off-page,類似 ORACLE 的行遷移,磁盤空間浪費較嚴重,且 I / O 性能也較差。因此,強烈不建議使用 BLOB、TEXT、超過 255 長度的 VARCHAR 列類型。
10、當 InnoDB 的文件格式(innodb_file_format)設置為 Antelope,并且行格式為 COMPACT 或 REDUNDANT 時,BLOB、TEXT 或者長 VARCHAR 列只會將其前 768 字節存儲在聚集索頁中(最大 768 字節的作用是便于創建前綴索引 /prefix index),其余更多的內容存儲在額外的 page 里,哪怕只是多了一個字節。因此,所有列長度越短越好。
11、在 off-page 中存儲的 BLOB、TEXT 或者長 VARCHAR 列的 page 是獨享的,不能共享。因此強烈不建議在一個表中使用多個長列。
綜上,如果在實際業務中,確實需要在 InnoDB 表中存儲 BLOB、TEXT、長 VARCHAR 列時,有下面幾點建議:
1、盡可能將所有數據序列化、壓縮之后,存儲在同一個列里,避免發生多次 off-page。
2、實際最大存儲長度低于 255 的列,轉成 VARCHAR 或者 CHAR 類型(如果是變長數據二者沒區別,如果是定長數據,則使用 CHAR 類型)。
3、如果無法將所有列整合到一個列,可以退而求其次,根據每個列最大長度進行排列組合后拆分成多個子表,盡量是的每個子表的總行長度小于 8KB,減少發生 off-page 的頻率。
4、上述建議是在 data page 為默認的 16KB 前提下,如果修改成 8KB 或者其他大小,請自行根據上述理論進行測試,找到最合適的值。
5、字符型列長度小于 255 時,無論采用 CHAR 還是 VARCHAR 來存儲,或者把 VARCHAR 列長度定義為 255,都不會導致實際表空間增大。
感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“如何優化 InnoDB 表 BLOB,TEXT 列的存儲效率”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!