MySQL5.7 JSON字段性能测试

表结构

JSON字段表
CREATE TABLE `invt_bin_dim_test` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`dim` json DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
传统表
CREATE TABLE `invt_bin_dim_tr_test` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `fty_code` varchar(50) NOT NULL DEFAULT '',
  `location_code` varchar(50) NOT NULL DEFAULT '',
  `wh_code` varchar(50) NOT NULL DEFAULT '',
  `area_code` varchar(50) NOT NULL DEFAULT '',
  `bin_code` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

插入性能

插入语句

JSON字段表语句
INSERT INTO invt_bin_dim_test (dim) 
VALUES (CONCAT('{"fty_code": "2000","location_code":"0001","wh_code":"W102","area_code":"P801","bin_code":"014"}'));
传统表语句
INSERT INTO `wms_2`.`invt_bin_dim_tr_test` (`fty_code`, `location_code`, `wh_code`, `area_code`, `bin_code`) VALUES ('2000', '0001', 'W1', 'PB801', '01-011'); 
结果对比
基础数据量传统表 (10次平均)JSON格式 (10次平均)
1条0.005s0.013s
100000条0.166s0.019s

说明:百万级插入数据时均出现了首次插入较慢,后续操作很快的现象(相差两至三个数量级)

查询性能
查询指定条件的单条数据记录
JSON字段表语句
SELECT 
dim ->> '$.fty_code' AS fty_code,
dim ->> '$.location_code' AS location_code
FROM invt_bin_dim_test
WHERE 
dim ->> '$.fty_code' = '2000'
AND dim ->> '$.location_code' = '0001'
AND dim ->> '$.wh_code' = 'W1'
AND dim ->> '$.area_code' = 'P801'
AND dim ->> '$.bin_code' ='01-005'
传统表语句
SELECT * FROM invt_bin_dim_tr_test
WHERE 
fty_code = '2000'
AND location_code = '0001'
AND wh_code = 'W1'
AND area_code = 'PB801'
AND bin_code = '01-011'
结果对比
基础数据总量传统表 (10次平均)JSON格式 (10次平均)
1条0.007s0.006s
100000条1.01s5.915s

使用虚列+索引后,JSON字段查询性能得到大幅度优化

JSON字段表语句

虚列
ALTER TABLE `invt_bin_dim_test` ADD `fty_code` VARCHAR(50) GENERATED ALWAYS AS (IFNULL(dim->>'$.fty_code', '')) VIRTUAL;
ALTER TABLE `invt_bin_dim_test` ADD `location_code` VARCHAR(50) GENERATED ALWAYS AS (IFNULL(dim->>'$.location_code', '')) VIRTUAL;
ALTER TABLE `invt_bin_dim_test` ADD `wh_code` VARCHAR(50) GENERATED ALWAYS AS (IFNULL(dim->>'$.wh_code', '')) VIRTUAL;
ALTER TABLE `invt_bin_dim_test` ADD `area_code` VARCHAR(50) GENERATED ALWAYS AS (IFNULL(dim->>'$.area_code', '')) VIRTUAL;
ALTER TABLE `invt_bin_dim_test` ADD `bin_code` VARCHAR(50) GENERATED ALWAYS AS (IFNULL(dim->>'$.bin_code', '')) VIRTUAL;
查询
SELECT * FROM invt_bin_dim_test 
WHERE 
fty_code = '2000' 
AND location_code = '0001'
AND wh_code = 'W1'
AND area_code = 'P801'
AND bin_code ='01-005'

与传统表增加字段索引后结果对比
基础数据总量传统表 (10次平均)JSON格式 (10次平均)
1条0.007s0.006s
100000条0.007s0.007s
更新性能
更新单条记录
JSON字段表语句
UPDATE invt_bin_dim_test SET dim = JSON_INSERT(dim, '$.wh_code', 'W202', '$.bin_code', '01-02-03') where id=3;UPDATE invt_bin_dim_test SET dim = JSON_SET(dim, '$.wh_code', 'W202', '$.bin_code', '01-02-03') WHERE id=3;UPDATE invt_bin_dim_test SET dim = JSON_REMOVE(dim, '$.area_code') WHERE id=3;
传统表语句
UPDATE invt_bin_dim_tr_test
SET bin_code = '01-012' 
WHERE 
fty_code = '2000'
AND location_code = '0001'
AND wh_code = 'W1'
AND area_code = 'PB801'
AND bin_code = '01-011'
结果对比
基础数据量传统表 (10次平均)JSON格式 (JSON_INSERT) (10次平均)JSON格式 (JSON_SET) (10次平均)JSON格式(JSON_REMOVE) (10次平均)
1条0.006s0.003s0.004s0.003s
100000条0.015s0.003s0.005s0.003s
批量更新记录
更新1000000条记录
结果对比
基础数据量传统表JSON格式 (JSON_INSERT)JSON格式 (JSON_SET)JSON格式(JSON_REMOVE)
100000条2 min 32 sec2 min 42 sec4 min 41 sec3 min 7 sec
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐