對mysql中json字段類型的幾個疑問


對mysql中json字段類型的幾個疑問

  • 測試環境: win10 Mysql5.7.31
  1. json字段如果置空,是否占用空間?占用多少空間?
  2. json字段對比一定長度的varchar哪個占用的空間大?
    針對該問題,我進行了測試,創建了兩張表,主鍵均為自增。
CREATE TABLE tb_1(
id int PRIMARY KEY auto_increment ,
info json
)
CREATE TABLE tb_2(
id int PRIMARY KEY auto_increment ,
info VARCHAR(512)
)

各有一個info字段,tb_1使用json類型,tb_2使用varchar類型,長度(512)。並為兩張表各插入了10000行數據。json的內容均為{"test":"1"}.

所占空間如下
image

這可以看得出,json字段實際占用的空間遠大於varchar(512),那如果將varchar的長度為1024呢?我又新建了一張tb_3,varchar的長度為1024.

CREATE TABLE tb_3(
id int PRIMARY KEY auto_increment ,
info VARCHAR(1024)
)

image
從上圖可得知,tb_2與tb_3的.ibd文件大小是一樣的,同為491,520字節,難道mysql的varchar字段大小不一致時,所占用的空間也相同嗎?

對於VARCHAR數據類型來說,硬盤上的存儲空間雖然都是根據實際字符長度來分配存儲空間的,但是對於內存來說,則不是。其時使用固定大小的內存塊來保存值。簡單的說,就是使用字符類型中定義的長度,即200個字符空間。顯然,這對於排序或者臨時表(這些內容都需要通過內存來實現)作業會產生比較大的不利影響所以如果某些字段會涉及到文件排序或者基於磁盤的臨時表時,分配VARCHAR數據類型時仍然不能夠太過於慷慨。還是要評估實際需要的長度,然后選擇一個最長的字段來設置字符長度。如果為了考慮冗余,可以留10%左右的字符長度。千萬不能認為其為根據實際長度來分配存儲空間,而隨意的分配長度,或者說干脆使用最大的字符長度。
————————————————
版權聲明:本文為CSDN博主「阿薩德執行」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u010365717/article/details/98496767

如果采用varchar字段進行存儲json還有一個壞處,你永遠無法確定你的json大小有多大,那么你就很難精准的去聲明這個長度,申請得多了或少了都不合適。那么使用json這類專項的字段也才是最合適的。但,mysql中還有一種字段,叫text,使用text字段來存儲json對於硬盤的占用是否與json字段一致呢?我再創建一張表tb_4來進行測試。

CREATE TABLE tb_4(
id int PRIMARY KEY auto_increment ,
info text
)

image
這從圖片中可以看得出,text字段與varcahr字段所占用的硬盤空間是一致的。
那么json字段與text字段對於內存的占用呢?以及json字段的長度上限是多少呢?

  • 關於表結構文件frm
    前面在進行對比tb_2與tb_3時,我發現.ibd文件的大小是相同的,但frm文件卻差了非常多,這還只是一個字段長度的差異,那么如果是多個字段長度差異較大呢?
    那么我將再創建幾張表進行對比,創建一張tb_4,有五個字段,均為varcahr,長度均為200。以及表tb_5,也是五個varchar字段,但是長度為300,再來查看


免責聲明!

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



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