mysql中json數據存varchar與json類型對於簡單查詢效率的影響


與朋友討論一些簡單json存儲的問題,產生了測試這一問題的想法,測試准備如下:

1.兩張表,分別如下,只有涉及到json字段的類型不同

CREATE TABLE `json_test` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int DEFAULT NULL,
`content` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`iamge` json DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=520303 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

 

CREATE TABLE `varchar_test` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int DEFAULT NULL,
`content` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
`image` varchar(1000) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=500001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

 

2.兩張表分別通過相同的方式進行批量插入,制造50w數據,每個userid都有100條數據,共5000個userid,生成的json數據內容如下:

["https://blog.csdn.net/gushaolin/article/details/103546517", "https://blog.csdn.net/gushaolin/article/details/103546517", "https://blog.csdn.net/gushaolin/article/details/103546517", "https://blog.csdn.net/gushaolin/article/details/103546517", "https://blog.csdn.net/gushaolin/article/details/103546517", "https://blog.csdn.net/gushaolin/article/details/103546517", "https://blog.csdn.net/gushaolin/article/details/103546517", "https://blog.csdn.net/gushaolin/article/details/103546517", "https://blog.csdn.net/gushaolin/article/details/103546517", "https://blog.csdn.net/gushaolin/article/details/103546517"]

 

 

 

 

 3.由於數據庫在雲服務器上,為了減少網絡延遲對查詢的影響,寫一個api放在服務器上,通過計算查詢時間差的方式來進行比較,並且api調用數據庫使用127.0.0.1,避免查詢走網關,代碼:

 

Map<String, Object> map = new HashMap<>();
LocalDateTime start = LocalDateTime.now();
List<JsonTest> list1 = jsonTestService.list(
new QueryWrapper<JsonTest>().lambda()
.eq(JsonTest::getUserId, 1)
);
LocalDateTime jsonEnd = LocalDateTime.now();
map.put("1", Duration.between(start, jsonEnd).toMillis());
LocalDateTime start2 = LocalDateTime.now();
List<VarcharTest> list2 = varcharTestService.list(
new QueryWrapper<VarcharTest>().lambda()
.eq(VarcharTest::getUserId, 1)
);
LocalDateTime varcharEnd = LocalDateTime.now();
map.put("2", Duration.between(start2, varcharEnd).toMillis());

 

 兩種查詢方式都是類似select * from table_name where user_id=1的查詢方式,避免查詢條件不同產生誤差

4.通過請求接口,比較響應中1、2的毫秒時間差,經過比較,兩種查詢的時間差不太穩定,互有快慢,通過20次左右查詢平均值比較,兩種查詢方式實際耗時基本相同,所以通過簡單的索引查詢帶json類型的數據,並不會拖慢查詢速度

 

結論:使用索引字段進行普通的數據查詢帶出json數據,效率與varchar類型基本一致,在業務中進行存儲且不進行使用json類型的字段查詢的場景下,是一個非常合適的方案,可以提升系統拓展性

 


免責聲明!

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



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