与朋友讨论一些简单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类型的字段查询的场景下,是一个非常合适的方案,可以提升系统拓展性

 

posted on 2022-01-08 10:34  lsz0210  阅读(3665)  评论(0编辑  收藏  举报