mysql?5.7.10
json 非數(shù)組
建表語(yǔ)句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 數(shù)據(jù) 插入 存儲(chǔ)過程
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; -- 關(guān)閉自動(dòng)提交事務(wù),提高插入效率 WHILE i <= 100000 DO SET user_name = CONCAT( SUBSTRING('趙錢孫李周吳鄭王馮陳褚衛(wèi)蔣沈韓楊朱秦尤許何呂施張孔曹嚴(yán)華金魏陶姜戚謝鄒喻柏水竺蘇潘范雷', FLOOR(RAND() * 54) + 1, 1), SUBSTRING('安寶彪彬冰博財(cái)成程達(dá)德東斗政法菲飛豐歌根光國(guó)海恒弘鴻宏洪華暉惠建健金景', 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則隨機(jī)生成在create_time基礎(chǔ)上加上一定天數(shù)的時(shí)間。 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初始值為當(dāng)前時(shí)間,每生成一行數(shù)據(jù)就自增1分鐘,以保證創(chuàng)建時(shí)間的遞增。 SET i = i + 1; IF i % 100000 = 0 THEN SET j = j + 1; END IF; END WHILE; end
call jsonQueryTest();
?json 類型 vs 普通字符串類型
-- json 非數(shù)組 -- 40 條記錄 無(wú)索引 多次查詢 400多ms select * from tb_json_test where user_name = '博玲' -- 創(chuàng)建 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 條記錄 無(wú)索引 json 多次查詢 700多ms select * from tb_json_test where JSON_CONTAINS(json_field -> '$.user_name', '"博玲"') -- json類型 字段 創(chuàng)建虛擬列索引 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 數(shù)組
建表語(yǔ)句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 數(shù)據(jù) 插入 存儲(chǔ)過程
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; -- 關(guān)閉自動(dòng)提交事務(wù),提高插入效率
WHILE i <= 100000 DO
SET user_name = CONCAT(
SUBSTRING('趙錢孫李周吳鄭王馮陳褚衛(wèi)蔣沈韓楊朱秦尤許何呂施張孔曹嚴(yán)華金魏陶姜戚謝鄒喻柏水竺蘇潘范雷', FLOOR(RAND() * 54) + 1, 1),
SUBSTRING('安寶彪彬冰博財(cái)成程達(dá)德東斗政法菲飛豐歌根光國(guó)海恒弘鴻宏洪華暉惠建健金景', 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則隨機(jī)生成在create_time基礎(chǔ)上加上一定天數(shù)的時(shí)間。
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初始值為當(dāng)前時(shí)間,每生成一行數(shù)據(jù)就自增1分鐘,以保證創(chuàng)建時(shí)間的遞增。
SET i = i + 1;
IF i % 100000 = 0 THEN
SET j = j + 1;
END IF;
END WHILE;
end
call jsonArrayQueryTest();
?json 類型 vs 普通字符串類型
-- json 數(shù)組
call jsonArrayQueryTest();
select * from tb_json_array_test
-- 40 條記錄 無(wú)索引 多次查詢 400多ms
select * from tb_json_array_test where user_name = '博玲'
-- 創(chuàng)建 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 條記錄 無(wú)索引 json 數(shù)組 多次查詢 800多ms
select * from tb_json_array_test where JSON_CONTAINS(json_field -> '$[*].user_name', '"博玲"')
-- json 數(shù)組 如果里面的對(duì)象不同 無(wú)法很好地建立虛擬索引
msyql?8.0.14
?創(chuàng)建表和存儲(chǔ)腳本和上面一樣這里不列舉了
json 非數(shù)組
?json 類型 vs 普通字符串類型
-- json 非數(shù)組
-- 40 條記錄 無(wú)索引 多次查詢 150多ms
select * from tb_json_test where user_name = '德韜'
-- 創(chuàng)建 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 條記錄 無(wú)索引 json 多次查詢 400多ms
select * from tb_json_test where JSON_CONTAINS(json_field -> '$.user_name', '"德韜"')
-- json類型 字段 創(chuàng)建虛擬列索引
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 數(shù)組
-- json 數(shù)組 call jsonArrayQueryTest(); select * from tb_json_array_test -- 40 條記錄 無(wú)索引 多次查詢 170多ms select * from tb_json_array_test where user_name = '博玲' -- 創(chuàng)建 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 條記錄 無(wú)索引 json 數(shù)組 多次查詢 600多ms select * from tb_json_array_test where JSON_CONTAINS(json_field -> '$[*].user_name', '"博玲"') -- json 數(shù)組 如果里面的對(duì)象不同 無(wú)法很好地建立虛擬索引
?
總結(jié)
數(shù)據(jù)不同機(jī)器和測(cè)試條件緣由僅供參考
5.7 版本中
json 類型 創(chuàng)建虛擬索引的查詢速度不差于創(chuàng)建索引的普通字符串,幾乎相同
非json數(shù)組
創(chuàng)建索引的普通字符串3ms >?創(chuàng)建虛擬索引 json3ms > 不創(chuàng)建索引的普通字符串 400ms> 不創(chuàng)建虛擬索引 json 700ms
json數(shù)組文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-441524.html
創(chuàng)建索引的普通字符串3ms >?創(chuàng)建虛擬索引 json3ms > 不創(chuàng)建索引的普通字符串 400ms> 不創(chuàng)建虛擬索引 json 800ms
8.0 版本中
json 類型 創(chuàng)建虛擬索引的查詢速度不差于創(chuàng)建索引的普通字符串,幾乎相同
非json數(shù)組
創(chuàng)建索引的普通字符串1.5ms >?創(chuàng)建虛擬索引 json1.5ms > 不創(chuàng)建索引的普通字符串 170ms> 不創(chuàng)建虛擬索引 json 400ms
json數(shù)組
創(chuàng)建索引的普通字符串1.5ms >?創(chuàng)建虛擬索引 json1.5ms > 不創(chuàng)建索引的普通字符串 170ms> 不創(chuàng)建虛擬索引 json 600ms文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-441524.html
到了這里,關(guān)于mysql 5.7 json 類型 json 數(shù)組類型 普通字符串類型 10w數(shù)據(jù) 查詢速度差異的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!