MySQL 5.7 對 JSON 的支持

最近有個業(yè)務(wù)需要能夠存儲Json并做一些簡單的業(yè)務(wù)邏輯處理。業(yè)務(wù)找到我說json的數(shù)據(jù)分析很難用mysql 5.6,這樣的純粹行存來處理難度很大嚣州,問我有沒啥辦法。

我第一想到的是mongodb,第二想到的就是mysql 5.7 溢陪。 然后一查,哎呀睛廊,已經(jīng)GA了形真。眾所周知的,mongodb的引擎層的穩(wěn)定性一直是短板超全,而innodb經(jīng)過10年的驗證咆霜,已經(jīng)是非常穩(wěn)定的東西了邓馒。

所以就在想,是不是可以試試mysql 5.7 蛾坯, 簡單嘗試光酣,發(fā)現(xiàn)mysql 5.7+?DRDS?,完全不帶mongoDB玩啊脉课。救军。。

看看我的簡單功能測試:

create table json_test ( uid int auto_increment,datajson,primary key(uid))engine=innodb;

建庫

mysql> insert into json_test values (NULL,'{"name":"name1","mobile":"15044447279","amount":400}');

Query OK, 1 row affected (0.01 sec)

mysql> insert into json_test values (NULL,'{"name":"name1","mobile":"15044447279","amount":300}');

Query OK, 1 row affected (0.01 sec)

mysql> insert into json_test values (NULL,'{"name":"name2","mobile":"15044447278","amount":300}');

Query OK, 1 row affected (0.01 sec)

mysql> insert into json_test values (NULL,'{"name":"name3","mobile":"15044447277","amount":300}');

Query OK, 1 row affected (0.01 sec)

>

插入四條語句

mysql> select data from json_test;

+-----------------------------------------------------------+

| data ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ??|

+-----------------------------------------------------------+

| {"name": "name1", "amount": 400, "mobile": "15044447279"}|

| {"name": "name1", "amount": 300, "mobile": "15044447279"}|

| {"name": "name2", "amount": 300, "mobile": "15044447278"}|

| {"name": "name3", "amount": 300, "mobile": "15044447277"}|

+-----------------------------------------------------------+

>

查詢這四條json語句

mysql> select data->"$.name" as name,sum(data->"$.amount") from json_test group by name;

+---------+-----------------------+

| name ? ?|sum(data->"$.amount") |

+---------+-----------------------+

| "name1" | ? ?? ? ?? ? ?? 700 |

| "name2" | ? ?? ? ?? ? ?? 300 |

| "name3" | ? ?? ? ?? ? ?? 300 |

+---------+-----------------------+

>

做個group by sum 常見的統(tǒng)計操作

insert into json_test values (NULL,'{"mobile":"15044447277","amount":300}');

>

插入一個不帶name的數(shù)據(jù)下翎,看看索引對空數(shù)據(jù)的兼容性情況缤言。

mysql> ALTER TABLE json_test ?ADDuser_name varchar(128) GENERATED ALWAYS AS(json_extract(data,'$.name')) VIRTUAL;

Query OK, 0 rows affected (0.05 sec)

Records: 0 ?Duplicates: 0?Warnings: 0

mysql> alter table json_test add index idx_username(user_name);

Query OK, 0 rows affected (0.04 sec)

Records: 0 ?Duplicates: 0?Warnings: 0

>

創(chuàng)建虛擬列并建立索引

mysql> select user_name,sum(data->"$.amount") fromjson_test where user_name = '"name1"';

+-----------+-----------------------+

| user_name | sum(data->"$.amount") |

+-----------+-----------------------+

| "name1" ? | ?? ? ?? ? ?? ? 700 |

+-----------+-----------------------+

>

查看符合某個user_name的數(shù)據(jù)的sum。

mysql> explain select user_name,sum(data->"$.amount")from json_test where user_name = '"name1"';

+----+-------------+-----------+------------+------+---------------+--------------+---------+-------+------+----------+-------+

| id | select_type | table ?? | partitions | type | possible_keys | key? ? ?? ?| key_len | ref? | rows | filtered | Extra |

+----+-------------+-----------+------------+------+---------------+--------------+---------+-------+------+----------+-------+

| ?1 | SIMPLE ?? ?| json_test | NULL? ? ? | ref?| idx_username ?| idx_username |131 ? ? | const |? ?2 | ? 100.00| NULL ?|

+----+-------------+-----------+------------+------+---------------+--------------+---------+-------+------+----------+-------+

>

確認帶索引數(shù)據(jù)走到了索引上

===========

然后视事,這東西竟然還支持事務(wù)胆萧。。這個就牛逼大了俐东。跌穗。

mysql> start transaction;

Query OK, 0 rows affected (0.00 sec)

>

開啟事務(wù)

mysql> select * from json_test;

+-----+-------------------------------------------------------------------+-----------+

| uid | data ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ?| user_name |

+-----+-------------------------------------------------------------------+-----------+

| ? 1 | {"name": "name1", "amount": 400,"mobile": "15044447279"} ? ?? ? | "name1" ?|

| ? 2 | {"name": "name1", "amount": 300,"mobile": "15044447279"} ? ?? ? | "name1" ?|

| ? 3 | {"name": "name2", "amount": 300,"mobile": "15044447278"} ? ?? ? | "name2" ?|

| ? 4 | {"name": "name3", "amount": 300,"mobile": "15044447277"} ? ?? ? | "name3" ?|

| ? 5 | {"amount": 300, "mobile":"15044447277"} ? ?? ? ?? ? ?? ? ?? ?| NULL ?? ?|

| ? 6 | {"amount": "300","name”:”name2”,”mobile": "15044447278"} ?? ? ? | NULL? ? ?|

+-----+-------------------------------------------------------------------+-----------+

>

查看原表。

mysql> insert into json_test (uid,data)?values (NULL,'{"name":"name1","mobile":"15044447279","amount":300}');

Query OK, 1 row affected (0.00 sec)

>

插入新數(shù)據(jù)

mysql> select * from json_test; ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ??+-----+-------------------------------------------------------------------+-----------+

| uid | data ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ?| user_name |

+-----+-------------------------------------------------------------------+-----------+

| ? 1 | {"name": "name1", "amount": 400,"mobile": "15044447279"} ? ?? ? | "name1" ?|

| ? 2 | {"name": "name1", "amount": 300,"mobile": "15044447279"} ? ?? ? | "name1" ?|

| ? 3 | {"name": "name2", "amount": 300,"mobile": "15044447278"} ? ?? ? | "name2" ?|

| ? 4 | {"name": "name3", "amount": 300,"mobile": "15044447277"} ? ?? ? | "name3" ?|

| ? 5 | {"amount": 300, "mobile":"15044447277"} ? ?? ? ?? ? ?? ? ?? ?| NULL ?? ?|

| ? 6 | {"amount": "300","name”:”name2”,”mobile": "15044447278"} ?? ? ? | NULL? ? ?|

| ? 7 | {"name": "name1", "amount": 300,"mobile": "15044447279"} ? ?? ? | "name1" ?|

+-----+-------------------------------------------------------------------+-----------+

7 rows in set (0.00 sec)

>

確認新數(shù)據(jù)

mysql> rollback;

回滾數(shù)據(jù)

mysql> select * from json_test;

+-----+-------------------------------------------------------------------+-----------+

| uid | data ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ?| user_name |

+-----+-------------------------------------------------------------------+-----------+

| ? 1 | {"name": "name1", "amount": 400,"mobile": "15044447279"} ? ?? ? | "name1" ?|

| ? 2 | {"name": "name1", "amount": 300,"mobile": "15044447279"} ? ?? ? | "name1" ?|

| ? 3 | {"name": "name2", "amount": 300,"mobile": "15044447278"} ? ?? ? | "name2" ?|

| ? 4 | {"name": "name3", "amount": 300,"mobile": "15044447277"} ? ?? ? | "name3" ?|

| ? 5 | {"amount": 300, "mobile":"15044447277"} ? ?? ? ?? ? ?? ? ?? ?| NULL ?? ?|

| ? 6 | {"amount": "300","name”:”name2”,”mobile": "15044447278"} ?? ? ? | NULL? ? ?|

+-----+-------------------------------------------------------------------+-----------+

6 rows in set (0.00 sec)

>

對mysql 5.7 好感度*2啊虏辫。蚌吸。臥槽。

猜測一下虛擬列的做法:

ALTER TABLE json_test ?ADD user_namevarchar(128) GENERATED ALWAYS AS (json_extract(data,'$.name'))VIRTUAL;

>

應該寫入的時候做一個trigger 每個json都運算json_extract(data,'$.name')砌庄,然后寫到一個新的不可修改的列里羹唠。

這個就可以讓原來的行存和文檔有一個非常完美的結(jié)合,當業(yè)務(wù)變化大的時候娄昆,放到j(luò)son里面佩微,而當變化穩(wěn)定下來,就遷移到行存里萌焰。

完美哺眯。 推薦!

微博_ID:淘寶沈詢_WhisperXD

http://weibo.com/p/230418693f08470102wi35

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扒俯,一起剝皮案震驚了整個濱河市奶卓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撼玄,老刑警劉巖夺姑,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異掌猛,居然都是意外死亡瑟幕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來只盹,“玉大人辣往,你說我怎么就攤上這事≈潮埃” “怎么了站削?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長孵稽。 經(jīng)常有香客問我许起,道長,這世上最難降的妖魔是什么菩鲜? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任园细,我火速辦了婚禮,結(jié)果婚禮上接校,老公的妹妹穿的比我還像新娘猛频。我一直安慰自己,他們只是感情好蛛勉,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布鹿寻。 她就那樣靜靜地躺著,像睡著了一般诽凌。 火紅的嫁衣襯著肌膚如雪毡熏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天侣诵,我揣著相機與錄音痢法,去河邊找鬼。 笑死杜顺,一個胖子當著我的面吹牛疯暑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哑舒,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼幻馁!你這毒婦竟也來了洗鸵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤仗嗦,失蹤者是張志新(化名)和其女友劉穎膘滨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稀拐,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡火邓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铲咨。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡躲胳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纤勒,到底是詐尸還是另有隱情坯苹,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布摇天,位于F島的核電站粹湃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泉坐。R本人自食惡果不足惜为鳄,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腕让。 院中可真熱鬧孤钦,春花似錦、人聲如沸记某。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽液南。三九已至壳猜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滑凉,已是汗流浹背统扳。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畅姊,地道東北人咒钟。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像若未,于是被迫代替她去往敵國和親朱嘴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 【MySQL】Linux下MySQL 5.5壤追、5.6和5.7的RPM、二進制和源碼安裝 1.1BLOG文檔結(jié)構(gòu)圖 ...
    小麥苗DB寶閱讀 10,509評論 0 31
  • 什么是數(shù)據(jù)庫供屉? 數(shù)據(jù)庫是存儲數(shù)據(jù)的集合的單獨的應用程序行冰。每個數(shù)據(jù)庫具有一個或多個不同的API溺蕉,用于創(chuàng)建,訪問悼做,管理...
    chen_000閱讀 4,030評論 0 19
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理疯特,服務(wù)發(fā)現(xiàn),斷路器贿堰,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 3月18日辙芍,球球28天了,明天就要停暖氣了羹与,我在忍受了28天之后故硅,洗了一個頭,這個舒爽纵搁,別提了吃衅,我又干凈回來了,我...
    曦寶閱讀 172評論 0 0
  • 文/蒙山樵夫 一天腾誉,我正在辦公徘层,突然接到弟子阿俊的電話,話筒里傳來他的粗氣利职,好像有什么急事要...
    蒙山樵夫下山來閱讀 533評論 4 4