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.005s 0.013s
100000條 0.166s 0.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.007s 0.006s
100000條 1.01s 5.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.007s 0.006s
100000條 0.007s 0.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.006s 0.003s 0.004s 0.003s
100000條 0.015s 0.003s 0.005s 0.003s

 

批量更新記錄

更新1000000條記錄

結果對比

基礎數據量 傳統表 JSON格式 (JSON_INSERT) JSON格式 (JSON_SET) JSON格式(JSON_REMOVE)
100000條 2 min 32 sec 2 min 42 sec 4 min 41 sec 3 min 7 sec

 

 


免責聲明!

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



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