日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql虚拟列(Generated Columns)及JSON字段类型的使用

發布時間:2024/2/28 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql虚拟列(Generated Columns)及JSON字段类型的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

mysql 5.7中有很多新的特性,但平時可能很少用到,這里列舉2個實用的功能:虛擬列及json字段類型

一、先創建一個測試表:

1

2

3

4

5

6

7

8

9

drop?table??if exists t_people;

?

CREATE?TABLE?t_people(

??`id`?INT(11)?NOT?NULL?AUTO_INCREMENT,

??`name`?varchar(50)?NOT?NULL?DEFAULT?'',

??`profile` json?not?null?,

??`created_at`?TIMESTAMP(3)?DEFAULT?CURRENT_TIMESTAMP(3)?ON?UPDATE?CURRENT_TIMESTAMP(3),

??`updated_at`?TIMESTAMP(3)?DEFAULT?CURRENT_TIMESTAMP(3)?ON?UPDATE?CURRENT_TIMESTAMP(3),

??PRIMARY?KEY?(id));

注:這里profile是一個json類型的字段,另db編碼采用utf8mb4 

?

二、生成測試數據

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

delimiter //

?

-- 寫一段存儲過程,方便后面生成測試數據

create?procedure?batchInsert()

?begin

??declare?i?int;

??declare?v_name?varchar(50);

??declare?v_profile?varchar(100);

??set?i=0;

??while i<100000 do

?????set?v_name = concat(substring('趙錢孫李周吳鄭王張楊',floor(1+(rand()*10)),1),substring('菩提樹下的楊過',floor(1+(rand()*7)),1),substring('我愛北京天安門',floor(1+(rand()*7)),1),i);

?????set?v_profile? = concat("{\"phone\":\"",concat('13',floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9))) ,?"\",\"age\":",i,"}");

?????insert?into?t_people(`name`,profile)?values(v_name,v_profile);

?????set?i=i+1;

??end?while;

?end; //

注:這段存儲過程不是本文重點,看不懂的同學不用深研,大概意思就是name隨機生成,profile隨機生成一個類似{"phone":"13xxxxxx","age":x}的內容。

調用一下這個存儲過程,生成100000條測試數據,數據大致長下面這樣:

需求來了,假如我們要查姓“張”的人有多少個?

這顯然是一個全表掃描!?

?

三、前綴索引?

肯定有同學想到了,在name上建一個前綴索引,只對name的第1個字做索引

1

alter?table?t_people?add?key?ix_name(name(1));

確實是個好辦法,效果也不錯

但是需求總是變化的,如果想查第2個字是“楊”的人有多少?

依然會全表掃描。

?

四、虛擬列

1

alter?table?t_people?add?second_name?varchar(3) generated always?as(substring(name,2,1)) stored;

創建了一個虛擬列second_name,其值是substring(name,2,1),即name中的第2個字,最后的stored表示,數據寫入時這個列的值就會計算(詳情可參考最后的參考鏈接)

注:虛擬列并不是真正的列,insert時也無法指定字段值。

然后在這個列上創建索引:

1

alter?table?t_people?add?index?ix_second_name(`second_name`);

再來看下執行計劃,索引生效了,掃描行數也明顯下降。

當然,sql語句也可以改成:

1

explain?select?count(0)?from?t_people?where?second_name='楊';

這樣看上去更直觀,效果不變。

?

五、json檢索

又來新需求了:要查profile中手機號為13589135467,并且姓“吳”的人

注意:profile->"$.phone"=xxx 就是json字段的檢索語法

分析執行計劃,可以看到前綴索引“ix_name”生效了,但還有優化空間,仍然可以借助虛擬列,創建2個虛擬列phone、first_name,并創建聯合索引。

1

2

3

alter?table?t_people?add?first_name?varchar(3) generated always?as(substring(name,1,1)) stored;

alter?table?t_people?add?phone?varchar(20) generated always?as(profile->"$.phone") stored;

alter?table?t_people?add?index?ix_phone_firstname(phone,first_name);

加了這2個虛擬列后,數據長這樣: 

注:phone列提取出來后,前后會帶上引號。

剛才的需求,可以改寫sql:

1

select?*?from?t_people?where?phone='\"13589135467\"'?and?name?like?'吳%';

最后看下執行計劃:  

掃描行數下降到個位數,效果十分明顯。

?

參考文章:

http://mysqlserverteam.com/generated-columns-in-mysql-5-7-5/

https://dev.mysql.com/doc/refman/5.7/en/json.html

總結

以上是生活随笔為你收集整理的mysql虚拟列(Generated Columns)及JSON字段类型的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产叼嘿视频在线观看 | 国产精品无遮挡 | 中国一级特黄毛片大片 | 久久波多野结衣 | 秋霞av一区二区三区 | 午夜国产在线视频 | 精品一区二区三区毛片 | 五十路av| 黄色av网页 | たちの熟人妻av一区二区 | 成年人视频在线观看免费 | 豆国产97在线 | 亚洲 | 日日夜夜天天综合 | 污片网址 | 亚洲欧美www | 亚洲第一偷拍 | 蜜桃无码一区二区三区 | 国产女人高潮的av毛片 | 99在线视频播放 | 欧美精品一级 | 欧洲国产精品 | 国产精品伦一区二区三区免费看 | 国产欧美日韩精品在线 | 带aaa级的网名 | 在线看片日韩 | 四虎网址在线观看 | www亚洲天堂 | 日韩三级黄色片 | 国产精品二区视频 | 久久精精品久久久久噜噜 | 亚洲欧美一级 | 精品网站999www | 国产成人av一区 | 国产亚洲欧美在线 | 中文字幕在线观看二区 | 日本不卡久久 | 青青五月天 | 亚洲视频综合网 | 免费中文av | 无遮挡边吃摸边吃奶边做 | 精品久久久视频 | 沟厕沟厕近拍高清视频 | 中文字幕在线视频日韩 | 午夜影院在线观看 | 91美女在线观看 | 欧美丰满艳妇bbwbbw | 亚洲成年人免费观看 | 亚洲精品tv| 精品国产一区二区在线观看 | 国产高清视频网站 | 永久av网站| 欧美一区二区三区久久久 | 国产无遮挡又黄又爽免费视频 | 69视频在线 | 亚洲xx网 | 日韩夜夜高潮夜夜爽无码 | 久久精品国产亚洲AV高清综合 | 亚洲一区影视 | 国产亚洲系列 | 午夜美女网站 | free性欧美hd另类| 四虎成人在线视频 | 国产手机在线 | 免费av一级 | 男人影院在线观看 | 一级黄色片在线看 | 欧美亚洲少妇 | 成人精品免费看 | 欧洲中文字幕日韩精品成人 | 欧美黄页| 日韩精品中字 | 1024毛片| 欧美精品videos另类 | 大尺度做爰呻吟舌吻情头 | 日韩a毛片| 亚洲在线中文字幕 | 成人午夜福利视频 | av一二区 | 午夜九九九 | 怡红院成人影院 | 午夜精品视频一区二区三区在线看 | 国产精品永久在线 | 蜜桃视频在线观看www | 久久福利社 | 97狠狠操 | 日本大尺度吃奶做爰久久久绯色 | 国产精品高潮视频 | 国内偷拍久久 | 久久精品无码人妻 | 亚洲春色www | 久久亚洲AV无码 | 久久久国产精品黄毛片 | 麻豆国产精品777777在线 | 男人天堂b | 国产麻豆一区二区三区在线观看 | 久久92 | 日韩精选在线观看 | 亚洲精品在线视频观看 | 亚洲激情欧美色图 |