mysql 5.7 json 类型 json 数组类型 普通字符串类型 10w数据 查询速度差异

这篇具有很好参考价值的文章主要介绍了mysql 5.7 json 类型 json 数组类型 普通字符串类型 10w数据 查询速度差异。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

mysql 5.7.10

mysql 5.7 json 类型 json 数组类型 普通字符串类型 10w数据 查询速度差异

json 非数组

建表语句ddl

CREATE TABLE tb_json_test (
  id INT NOT NULL AUTO_INCREMENT,
  user_no VARCHAR(100),
  user_name VARCHAR(100),
  score INT,
  create_time date,
  update_time date,
  remark VARCHAR(100),
  field1 VARCHAR(100),
  field2 VARCHAR(100),
  field3 VARCHAR(100),
  field4 VARCHAR(100),
  field5 VARCHAR(100),
  field6 VARCHAR(100),
  field7 VARCHAR(100),
  field8 VARCHAR(100),
  json_field json,
  PRIMARY KEY (id)
);

10w 数据 插入 存储过程

create PROCEDURE `demo02`.`jsonQueryTest`()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE j INT DEFAULT 2011;
    DECLARE user_name VARCHAR(20);
    DECLARE user_no VARCHAR(20);
    DECLARE score INT;
    DECLARE create_time DATETIME DEFAULT NOW();
    DECLARE update_time DATETIME;
    DECLARE remark VARCHAR(50);
    declare field1 VARCHAR(100); 
    declare field2 VARCHAR(100); 
    declare field3 VARCHAR(100); 
    declare field4 VARCHAR(100); 
    declare field5 VARCHAR(100); 
    declare field6 VARCHAR(100); 
    declare field7 VARCHAR(100); 
    declare field8 VARCHAR(100); 
    declare id VARCHAR(100); 
    declare json_field json;
        set autocommit=0; -- 关闭自动提交事务,提高插入效率
    
    WHILE i <= 100000 DO
        SET user_name = CONCAT(
            SUBSTRING('赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水竺苏潘范雷', FLOOR(RAND() * 54) + 1, 1),
            SUBSTRING('安宝彪彬冰博财成程达德东斗政法菲飞丰歌根光国海恒弘鸿宏洪华晖惠建健金景', FLOOR(RAND() * 30) + 1, 1),
            SUBSTRING('静俊凯克莉良亮林玲龙茂梅民敏明娜宁鹏平奇琪全仁荣瑞森帅顺涛韬', FLOOR(RAND() * 30) + 1, 1)
        );
        SET user_no = CONCAT(j, LPAD(i, 7, '0'));
        SET score = FLOOR(RAND() * 101);
        SET remark = CONCAT('remark_', i);
        SET update_time = DATE_ADD(create_time, INTERVAL FLOOR(RAND() * 100) DAY); -- update_time则随机生成在create_time基础上加上一定天数的时间。
        set field1 = replace(uuid(),"-","");
           set field2 = replace(uuid(),"-","");
        set field3 = replace(uuid(),"-","");
        set field4 = replace(uuid(),"-","");
        set field5 = replace(uuid(),"-",""); 
        set field6 = replace(uuid(),"-","");
        set field7 = replace(uuid(),"-","");
        set field8 = replace(uuid(),"-","");
        set id = i;
        set json_field = JSON_OBJECT('user_no', user_no, 'user_name', user_name, 'score', score);
        INSERT INTO demo02.tb_json_test(id, user_no, user_name, score, create_time, update_time, remark, field1, field2, field3, field4, field5, field6, field7, field8, json_field)
        VALUES(id, user_no, user_name, score, create_time, update_time, remark,field1, field2, field3, field4, field5, field6, field7, field8, json_field);
        
                SET create_time = DATE_ADD(create_time, INTERVAL 1 SECOND); -- create_time初始值为当前时间,每生成一行数据就自增1分钟,以保证创建时间的递增。
        SET i = i + 1;
        IF i % 100000 = 0 THEN
            SET j = j + 1;
        END IF;
    END WHILE;
end

call jsonQueryTest();

 json 类型 vs 普通字符串类型

-- json 非数组
-- 40 条记录 无索引 多次查询 400多ms 
select * from tb_json_test where user_name = '博玲'
-- 创建 user_name 索引
CREATE INDEX idx_user_name ON tb_json_test(user_name);
-- 40 条记录 有索引 多次查询 3左右ms 
select * from tb_json_test where user_name = '博玲'
-- 40 条记录 无索引 json 多次查询 700多ms 
select * from tb_json_test where JSON_CONTAINS(json_field -> '$.user_name', '"博玲"')
-- json类型 字段 创建虚拟列索引
ALTER TABLE tb_json_test ADD COLUMN v_user_name VARCHAR(255) AS (JSON_EXTRACT(json_field, '$.user_name')) VIRTUAL;
CREATE INDEX idx_v_user_name ON tb_json_test(v_user_name);
-- 40 条记录 有索引 多次查询 3左右ms 
select * from tb_json_test where v_user_name = '"博玲"'

json 数组

建表语句ddl

CREATE TABLE tb_json_array_test (
id INT NOT NULL AUTO_INCREMENT,
user_no VARCHAR(100),
user_name VARCHAR(100),
score INT,
create_time date,
update_time date,
remark VARCHAR(100),
field1 VARCHAR(100),
field2 VARCHAR(100),
field3 VARCHAR(100),
field4 VARCHAR(100),
field5 VARCHAR(100),
field6 VARCHAR(100),
field7 VARCHAR(100),
field8 VARCHAR(100),
json_field json,
PRIMARY KEY (id)
);

10w 数据 插入 存储过程


create PROCEDURE `demo02`.`jsonArrayQueryTest`()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE j INT DEFAULT 2011;
DECLARE user_name VARCHAR(20);
DECLARE user_no VARCHAR(20);
DECLARE score INT;
DECLARE create_time DATETIME DEFAULT NOW();
DECLARE update_time DATETIME;
DECLARE remark VARCHAR(50);
declare field1 VARCHAR(100);
declare field2 VARCHAR(100);
declare field3 VARCHAR(100);
declare field4 VARCHAR(100);
declare field5 VARCHAR(100);
declare field6 VARCHAR(100);
declare field7 VARCHAR(100);
declare field8 VARCHAR(100);
declare id VARCHAR(100);
declare json_field json;
set autocommit=0; -- 关闭自动提交事务,提高插入效率

WHILE i <= 100000 DO
SET user_name = CONCAT(
SUBSTRING('赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水竺苏潘范雷', FLOOR(RAND() * 54) + 1, 1),
SUBSTRING('安宝彪彬冰博财成程达德东斗政法菲飞丰歌根光国海恒弘鸿宏洪华晖惠建健金景', FLOOR(RAND() * 30) + 1, 1),
SUBSTRING('静俊凯克莉良亮林玲龙茂梅民敏明娜宁鹏平奇琪全仁荣瑞森帅顺涛韬', FLOOR(RAND() * 30) + 1, 1)
);
SET user_no = CONCAT(j, LPAD(i, 7, '0'));
SET score = FLOOR(RAND() * 101);
SET remark = CONCAT('remark_', i);
SET update_time = DATE_ADD(create_time, INTERVAL FLOOR(RAND() * 100) DAY); -- update_time则随机生成在create_time基础上加上一定天数的时间。
set field1 = replace(uuid(),"-","");
set field2 = replace(uuid(),"-","");
set field3 = replace(uuid(),"-","");
set field4 = replace(uuid(),"-","");
set field5 = replace(uuid(),"-","");
set field6 = replace(uuid(),"-","");
set field7 = replace(uuid(),"-","");
set field8 = replace(uuid(),"-","");
set id = i;
set json_field = JSON_ARRAY(JSON_OBJECT('user_no', user_no, 'user_name', user_name, 'score', score), JSON_OBJECT('user_no', user_no, 'user_name', user_name, 'score', score));
INSERT INTO demo02.tb_json_array_test(id, user_no, user_name, score, create_time, update_time, remark, field1, field2, field3, field4, field5, field6, field7, field8, json_field)
VALUES(id, user_no, user_name, score, create_time, update_time, remark,field1, field2, field3, field4, field5, field6, field7, field8, json_field);

SET create_time = DATE_ADD(create_time, INTERVAL 1 SECOND); -- create_time初始值为当前时间,每生成一行数据就自增1分钟,以保证创建时间的递增。
SET i = i + 1;
IF i % 100000 = 0 THEN
SET j = j + 1;
END IF;
END WHILE;
end

call jsonArrayQueryTest();

 json 类型 vs 普通字符串类型

-- json 数组
call jsonArrayQueryTest();
select * from tb_json_array_test
-- 40 条记录 无索引 多次查询 400多ms
select * from tb_json_array_test where user_name = '博玲'
-- 创建 user_name 索引
CREATE INDEX idx_user_name ON tb_json_array_test(user_name);
-- 40 条记录 有索引 多次查询 3左右ms
select * from tb_json_array_test where user_name = '博玲'
-- 40 条记录 无索引 json 数组 多次查询 800多ms
select * from tb_json_array_test where JSON_CONTAINS(json_field -> '$[*].user_name', '"博玲"')
-- json 数组 如果里面的对象不同 无法很好地建立虚拟索引

msyql 8.0.14

mysql 5.7 json 类型 json 数组类型 普通字符串类型 10w数据 查询速度差异

 创建表和存储脚本和上面一样这里不列举了

json 非数组

 json 类型 vs 普通字符串类型

-- json 非数组
-- 40 条记录 无索引 多次查询 150多ms
select * from tb_json_test where user_name = '德韬'
-- 创建 user_name 索引
CREATE INDEX idx_user_name ON tb_json_test(user_name);
-- 40 条记录 有索引 多次查询 1.5左右ms
select * from tb_json_test where user_name = '德韬'
-- 40 条记录 无索引 json 多次查询 400多ms
select * from tb_json_test where JSON_CONTAINS(json_field -> '$.user_name', '"德韬"')
-- json类型 字段 创建虚拟列索引
ALTER TABLE tb_json_test ADD COLUMN v_user_name VARCHAR(255) AS (JSON_EXTRACT(json_field, '$.user_name')) VIRTUAL;
CREATE INDEX idx_v_user_name ON tb_json_test(v_user_name);
-- 40 条记录 有索引 多次查询 1.5左右ms
select * from tb_json_test where v_user_name = '"德韬"'

json 数组

-- json 数组
call jsonArrayQueryTest();
select * from tb_json_array_test
-- 40 条记录 无索引 多次查询 170多ms
select * from tb_json_array_test where user_name = '博玲'
-- 创建 user_name 索引
CREATE INDEX idx_user_name ON tb_json_array_test(user_name);
-- 40 条记录 有索引 多次查询 1.5左右ms
select * from tb_json_array_test where user_name = '博玲'
-- 40 条记录 无索引 json 数组 多次查询 600多ms
select * from tb_json_array_test where JSON_CONTAINS(json_field -> '$[*].user_name', '"博玲"')
-- json 数组 如果里面的对象不同 无法很好地建立虚拟索引

 

总结

数据不同机器和测试条件缘由仅供参考

5.7 版本中

json 类型 创建虚拟索引的查询速度不差于创建索引的普通字符串,几乎相同

非json数组

创建索引的普通字符串3ms > 创建虚拟索引 json3ms > 不创建索引的普通字符串 400ms> 不创建虚拟索引 json 700ms

json数组

创建索引的普通字符串3ms > 创建虚拟索引 json3ms > 不创建索引的普通字符串 400ms> 不创建虚拟索引 json 800ms

8.0 版本中

json 类型 创建虚拟索引的查询速度不差于创建索引的普通字符串,几乎相同

非json数组

创建索引的普通字符串1.5ms > 创建虚拟索引 json1.5ms > 不创建索引的普通字符串 170ms> 不创建虚拟索引 json 400ms

json数组

创建索引的普通字符串1.5ms > 创建虚拟索引 json1.5ms > 不创建索引的普通字符串 170ms> 不创建虚拟索引 json 600ms文章来源地址https://www.toymoban.com/news/detail-441524.html

到了这里,关于mysql 5.7 json 类型 json 数组类型 普通字符串类型 10w数据 查询速度差异的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 7. Hive解析JSON字符串、JSON数组

    Hive解析JSON字符串 1. get_json_object 语法: get_json_object(json_string, path) json_string 是要解析的JSON字符串 path 是用于指定要提取的字段路径的字符串 局限性 get_json_object 函数的性能会受到 JSON数据的结构和大小 的影响。对于较复杂的嵌套结构,考虑使用Hive的其他函数或自定义函数来

    2024年02月11日
    浏览(39)
  • java将json字符串转换成json数组

    有些时候我们需要将json字符串转换成数组,并且只取一些属性值进行下一个方法的赋值,这样就涉及到了json字符串的转换了, json字符串有两种形式,一种是以{A,B,C},一种是[{A},{B},{C}]。但是很多时候是这两种的结合。 首先导入jar包 如果是第一种只需要加入以下代码,注意

    2024年02月11日
    浏览(41)
  • 如何将JSON字符串数组转对象集合

    1、、、引入jar 包 2、Java对象转成JSON格式 3、JSON格式字符串转换成Java对象 3.1、直接将JSON字符串转换成Java对象 3.2、先将JSON字符串转换成JSON对象,再转换成Java对象 3.3、如果JSON字符串是一个JSON数组,并且数组里面存放的同一种类型的对象,可以将这个JSON数组转换成Java的Li

    2024年02月02日
    浏览(50)
  • hivesql 将json格式字符串转为数组

    完整过程SQL在文末 本案例 json 字符串参考格式,请勿使用本数据 本案例测试数据,复制保存后请勿格式化 本案例为数仓分层设计 创建ods层原始数据表 创建dwd层维度数据表 ETL转换ods层数据插入到dwd层 创建ods层原始数据表 加载测试数据 创建dwd层维度数据表 ETL转换ods层数据插

    2024年02月03日
    浏览(31)
  • 实体类中嵌套Enum类型并想转换成JSON字符串时遇到的问题。

    先说明问题的产生,在自己写着玩的时候,新建了一个 User 类如下: 不难看出User类中,用到了枚举类把性别规定成了两个。 下面是SexEnum类: 这里,当我想通过工具类将其转换成json字符串并且让枚举中的 值能返回对应的文字时,出现了问题。返回的值是枚举类的 属性名 而

    2024年02月08日
    浏览(31)
  • 【⑭MySQL | 数据类型(二)】字符串 | 二进制类型

    ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL字符串 | 二进制类型类型的分享 ✨ 5 字符串类型 字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找。 下表中列出了 MySQL 中

    2024年02月11日
    浏览(32)
  • MySQL 将字符串转换为数字类型并进行排序

    示例数据:area_gdp 表 id    area    gdp 1    北京    1200 2    上海    6100 3    广州    6000 4    深圳    980 select * from area_gdp ORDER BY gdp ASC # 查询结果如下 1    北京        1200 3    广州     6000 2    上海        6100 4    深圳     980 SELECT * FROM area_gdp OR

    2024年02月05日
    浏览(36)
  • 【MySQL】MySQL 数据类型,数值、日期和时间、字符串类型,创建数据表,删除数据表

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 MySQL 中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL 支持多种类型,大致可以分为三类:数值、日

    2024年02月15日
    浏览(53)
  • mysql sql语句将查出来的每列变为字符串类型

    在MySQL中,可以使用CAST()函数或CONVERT()函数将查出来的每列数据转换为字符串类型。具体用法如下: 使用CAST()函数: 其中,column_name为需要转换为字符串的列名,new_column_name为新的列别名,可以根据需要自定义。 使用CONVERT()函数: 其中,column_name为需要转换为字符串的列名,

    2024年02月16日
    浏览(32)
  • JS中字符串切割为数组/数组拼接为字符串

    (1)语法格式: 其中所选分隔符使用双引号(“”)或者单引号(‘’)括起来; 所生成的数组会存放于前面定义的数组变量中。 (2)样例: JS代码: 运行结果: (3)其他用法: ①当所选分隔符为空时,返回的数组即将每个字符分割出来: JS代码: 运行结果: ②分隔

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包