资讯详情

mysql json性能测试

总条数100-101万

2核4线程4g内存

Mysql版本:5.7.31

在底部制作数据 ---------测试--------------------------------------------------------------------------------------- 1.没有索引,id主键,count对比,json明显比传统慢很多,接近60ms。 count(*)耗时小于count(id),大约8ms

select count(id) from invt_bin_dim_test > OK > 时间: 0.302s

select count(id) from invt_bin_dim_tr_test > OK > 时间: 0.215s

select count(id) from invt_bin_dim_test; select count(id) from invt_bin_dim_tr_test;

添加索引后count,json比传统慢很多,接近6ms。 select count(id) from invt_bin_dim_test > OK > 时间: 0.222s

select count(id) from invt_bin_dim_tr_test > OK > 时间: 0.186s

2.未加索引,插入100万后,插入单个测试

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 `invt_bin_dim_tr_test` (`fty_code`, `location_code`, `wh_code`, `area_code`, `bin_code`) VALUES ('2000', '0001', 'W102', 'P801', '014');

3.未加索引,分批插入测试 单次插入10条,传统的比json的快接近1ms

4.没有索引,查询全部,json接近5s,传统的2.5s,差别较大. SELECT id, dim ->> '$.fty_code' AS fty_code, dim ->> '$.location_code' AS location_code, dim ->> '$.wh_code' as wh_code, dim ->> '$.area_code' as area_code, dim ->> '$.bin_code' as bin_code FROM invt_bin_dim_test WHERE dim ->> '$.fty_code' = '2000' AND dim ->> '$.location_code' = '0001' AND dim ->> '$.wh_code' = 'W102' AND dim ->> '$.area_code' = 'P801' AND dim ->> '$.bin_code' ='014';

SELECT * FROM invt_bin_dim_tr_test WHERE fty_code = '2000' AND location_code = '0001' AND wh_code = 'W102' AND area_code = 'P801' AND bin_code = '014';

5.未添加索引,添加虚拟列后查询对比,json接近5s,传统的2.5s,差别较大.

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 id,fty_code,location_code,wh_code,area_code,bin_code FROM invt_bin_dim_test WHERE fty_code = '2000' AND location_code = '0001' AND wh_code = 'W102' AND area_code = 'P801' AND bin_code = '014' > OK > 时间: 5.278s

SELECT id,fty_code,location_code,wh_code,area_code,bin_code FROM invt_bin_dim_tr_test WHERE fty_code = '2000' AND location_code = '0001' AND wh_code = 'W102' AND area_code = 'P801' AND bin_code = '014' > OK > 时间: 2.671s

6.未添加索引,添加虚拟列后插入对比,插入json慢1ms左右,略大于1ms

7.没有索引更新比较,传统比较json慢很多,一次更新100条,json大约6ms,传统的接近39ms

CALL testUpdateJson1() > OK > 时间: 0.06s

CALL testUpdateJson2() > OK > 时间: 0.039s

SELECT id,fty_code,location_code,wh_code,area_code,bin_code FROM invt_bin_dim_test WHERE id=3;

SELECT id,fty_code,location_code,wh_code,area_code,bin_code FROM invt_bin_dim_tr_test 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_tr_test SET bin_code = '01-012', wh_code='W202' WHERE id=3;

8.添加索引时,json 17.2s,传统14.2s。 ALTER TABLE `invt_bin_dim_test` ADD INDEX `t1`(`fty_code`), ADD INDEX `t2`(`location_code`), ADD INDEX `t3`(`wh_code`), ADD INDEX `t4`(`area_code`), ADD INDEX `t5`(`bin_code`);

ALTER TABLE `invt_bin_dim_tr_test` ADD INDEX `t1`(`fty_code`), ADD INDEX `t2`(`location_code`), ADD INDEX `t3`(`wh_code`), ADD INDEX `t4`(`area_code`), ADD INDEX `t5`(`bin_code`);

添加索引后,插入测试,单次插入100条,json 31ms,传统 29ms,慢接近2ms

添加索引后,更新测试,单次更新100条,json大约9ms,传统的接近39ms 传统的更新时间在添加索引前后变化不大,json由原先的6ms增加到9ms

11.添加索引后,更新100万次测试 ,json 141s,传统 123s。json慢18s左右 UPDATE invt_bin_dim_test SET dim = JSON_SET(dim, '$.wh_code', 'W203', '$.bin_code', '01-02-04');

UPDATE invt_bin_dim_tr_test SET bin_code = '01-014', wh_code='W203';

12.加索引后,查询所有时间 a、空记录结果时 json 1.75s,传统0.003 SELECT  id, dim ->> '$.fty_code' AS fty_code, dim ->> '$.location_code' AS location_code, dim ->> '$.wh_code' as wh_code, dim ->> '$.area_code' as area_code, dim ->> '$.bin_code' as bin_code FROM invt_bin_dim_test WHERE  dim ->> '$.fty_code' = '2000' AND dim ->> '$.location_code' = '0001' AND dim ->> '$.wh_code' = 'W102' AND dim ->> '$.area_code' = 'P801' AND dim ->> '$.bin_code' ='014';

SELECT * FROM  invt_bin_dim_tr_test WHERE  fty_code = '2000' AND location_code = '0001' AND wh_code = 'W102' AND area_code = 'P801' AND bin_code = '014';

b、结果空记录时 json <传统 ,相差小于1ms,大约 SELECT id,fty_code,location_code,wh_code,area_code,bin_code FROM  invt_bin_dim_test WHERE  fty_code = '2000' AND location_code = '0001' AND wh_code = 'W102' AND area_code = 'P801' AND bin_code = '014';

SELECT id,fty_code,location_code,wh_code,area_code,bin_code FROM  invt_bin_dim_tr_test WHERE  fty_code = '2000' AND location_code = '0001' AND wh_code = 'W102' AND area_code = 'P801' AND bin_code = '014';

------------------------------------------------------------------------------------

---------------------下面是造数据

CREATE TABLE `invt_bin_dim_test` (   `id` bigint(20) NOT NULL AUTO_INCREMENT,   `dim` json DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

传统表 CREATE TABLE `invt_bin_dim_tr_test` (   `id` bigint(20) NOT NULL AUTO_INCREMENT,   `fty_code` varchar(50) NULL DEFAULT '',   `location_code` varchar(50) NULL DEFAULT '',   `wh_code` varchar(50) NULL DEFAULT '',   `area_code` varchar(50) NULL DEFAULT '',   `bin_code` varchar(50) NULL DEFAULT '',   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

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 `invt_bin_dim_tr_test` (`fty_code`, `location_code`, `wh_code`, `area_code`, `bin_code`) VALUES ('2000', '0001', 'W102', 'P801', '014');

drop procedure if exists testJson;

delimiter $$ create procedure testJson() BEGIN declare i int(11); set i = 1;  WHILE i <= 1000000 do 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 `invt_bin_dim_tr_test` (`fty_code`, `location_code`, `wh_code`, `area_code`, `bin_code`) VALUES ('2000', '0001', 'W102', 'P801', '014'); set i = i + 1; end WHILE; end $$

CALL testJson();

drop procedure if exists testInsertJson1;

delimiter $$ create procedure testInsertJson1() BEGIN declare i int(11); set i = 1;  WHILE i <= 100 do INSERT INTO invt_bin_dim_test (dim)  VALUES ('{"fty_code": "2000","location_code":"0001","wh_code":"W102","area_code":"P801","bin_code":"014"}'); set i = i + 1; end WHILE; end $$

delimiter $$ create procedure testInsertJson2() BEGIN declare i int(11); set i = 1;  WHILE i <= 100 do INSERT INTO `invt_bin_dim_tr_test` (`fty_code`, `location_code`, `wh_code`, `area_code`, `bin_code`) VALUES ('2000', '0001', 'W102', 'P801', '014'); set i = i + 1; end WHILE; end $$

CALL testInsertJson1(); CALL testInsertJson2();

delimiter $$ create procedure testUpdateJson1() BEGIN declare i int(11); set i = 1;  WHILE i <= 100 do

UPDATE invt_bin_dim_test SET dim = JSON_SET(dim, '$.wh_code', 'W202', '$.bin_code', '01-02-03') where id=3;

set i = i + 1; end WHILE; end $$

delimiter $$ create procedure testUpdateJson2() BEGIN declare i int(11); set i = 1;  WHILE i <= 100 do

UPDATE invt_bin_dim_tr_test SET bin_code = '01-012', wh_code='W202' WHERE id=3;

set i = i + 1; end WHILE; end $$

CALL testUpdateJson1(); CALL testUpdateJson2();

参考:

https://www.cnblogs.com/amerkor/p/13646581.html https://blog.csdn.net/ai_xao/article/details/100711808

标签: w202可调电阻参数

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台