日韩亚洲人成在线综合-日韩一卡2卡三卡4卡无卡网站-日韩孕交-日韩在线一区二区-wwwxxxx在线观看-wwwxx免费


 

聯(lián)合索引該如何選擇合適的列?
發(fā)布時(shí)間:2023-05-05 13:14:27 文章來(lái)源:江南一點(diǎn)雨
前面一篇文章,松哥和大家聊了MySQL中的索引合并,雖然MySQL提供了索引合并機(jī)制來(lái)提升SQL執(zhí)行的效率,然而

前面一篇文章,松哥和大家聊了 MySQL 中的索引合并,雖然 MySQL 提供了索引合并機(jī)制來(lái)提升 SQL 執(zhí)行的效率,然而在具體實(shí)踐中,如果能避免發(fā)生索引合并是最好的,畢竟這是沒辦法的辦法,是一個(gè)下下策。發(fā)生索引合并大概率是因?yàn)槲覀兯饕谠O(shè)計(jì)的時(shí)候就有問題,設(shè)計(jì)好聯(lián)合索引,我們就能在一定程度上避免發(fā)生索引合并問題。


(資料圖片僅供參考)

1. 聯(lián)合索引1.1 什么是聯(lián)合索引

聯(lián)合索引就是數(shù)據(jù)表中的多個(gè)字段,共同組成一個(gè)索引。由于 InnoDB 中索引的數(shù)據(jù)結(jié)構(gòu)是一個(gè) B+Tree,當(dāng)是一個(gè)聯(lián)合索引的時(shí)候,排序的時(shí)候會(huì)首先按照聯(lián)合索引的第一個(gè)字段排序,如果第一個(gè)字段的值相同,則按照第二個(gè)字段排序,如果第二個(gè)字段的值也相同,則按照第三個(gè)字段排序,以此類推。

舉一個(gè)簡(jiǎn)單的例子,假設(shè)我有如下數(shù)據(jù):

id

username

age

address

gender

1

ab

99

深圳

2

ac

98

廣州

3

af

88

北京

4

bc

80

上海

5

bg

85

重慶

6

bw

95

天津

7

bw

99

海口

8

cc

92

武漢

9

ck

90

深圳

10

cx

93

深圳

現(xiàn)在我給 username 和 age 字段建立聯(lián)合索引,那么 B+Tree 在排序的時(shí)候,會(huì)首先按照 username 排序,當(dāng) username 相同的時(shí)候,再按照 age 進(jìn)行排序。畫出來(lái)的 B+Tree 如下圖:

如上圖,bw 相同的時(shí)候,按照 age 進(jìn)行排序。

如果我們想要在 MySQL 中,讓聯(lián)合索引發(fā)揮最大作用,就要充分考慮到聯(lián)合索引中各字段的順序。

1.2 聯(lián)合索引順序要考慮哪些因素?

在設(shè)計(jì)聯(lián)合索引的時(shí)候,我們最容易想到的原則是查詢條件影響了聯(lián)合索引中各個(gè)字段的順序,要根據(jù)查詢條件來(lái)設(shè)計(jì)聯(lián)合索引中各個(gè)字段的順序。

實(shí)際上,除了上面提到的查詢條件之外,聯(lián)合索引的順序還會(huì)影響到查詢的排序和分組等,所以,設(shè)計(jì)聯(lián)合索引的順序可以算是一個(gè)真真正正的技術(shù)活。

2. 案例分析

松哥這里還是使用官方的案例吧,小伙伴們?cè)诠娞?hào)后臺(tái)回復(fù)mysql官方案例可以獲取到這個(gè)數(shù)據(jù)庫(kù)腳本的下載地址。

在 MySQL 的官方案例中,有一個(gè)支付表 payment,如下圖:

小伙伴們從圖中可以看到,這個(gè)表中有一個(gè) customer_id 和一個(gè) staff_id,現(xiàn)在假設(shè)我想要按照這兩個(gè)來(lái)進(jìn)行搜索,例如執(zhí)行如下 SQL:

select * from payment where customer_id=1 and staff_id=2;

查詢條件有兩個(gè),我想建立一個(gè)聯(lián)合索引,那么究竟是把 customer_id 放在前面還是把 staff_id 放在前面呢?

一個(gè)比較常用的法則是看字段的選擇性,選擇性高的字段應(yīng)該是放在前面。有的小伙伴可能還不清楚什么是字段的選擇性,可以參考松哥之前的文章:前綴索引,在性能和空間中尋找平衡。

那么怎么獲取各個(gè)字段的選擇性呢?這個(gè)很好計(jì)算,一個(gè) SQL 搞定,如下:

select count(distinct customer_id)/count(1) as c,count(distinct staff_id)/count(1) as s from payment;

執(zhí)行結(jié)果如下:

可以看到,customer_id 的選擇性為 0.0373,而 staff_id 的選擇性為 0.0001,那么在建立聯(lián)合索引的時(shí)候,將 customer_id 放在第一列顯然更合適一些,因?yàn)樗倪x擇性更高(意味著字段里邊重復(fù)的值相對(duì)來(lái)說會(huì)少一些),根據(jù) customer_id 更容易鎖定一行,查詢效率要更高一些。

不過需要注意,上面的法則并非放之四海而皆準(zhǔn),還是要具體問題具體分析。在一些特別極端的情況下,索引選擇性非常之低,那個(gè)時(shí)候就沒有必要建立聯(lián)合索引了。特殊情況甚至需要我們從業(yè)務(wù)邏輯上去解決。

松哥舉一個(gè)例子來(lái)說明這個(gè)問題。

在我第一版的 vhr 中,當(dāng)時(shí)有一個(gè)系統(tǒng)通知的功能,就是管理員可以給所有的用戶群發(fā)消息。用戶之間也可以互發(fā)消息,如果發(fā)送消息的時(shí)候,用戶不在線,就需要先把消息存到數(shù)據(jù)庫(kù)中,等用戶上線了再推給用戶,那么就需要一張表來(lái)保存消息。這個(gè)表中有一個(gè)字段就是消息發(fā)送者,由于網(wǎng)站經(jīng)常需要發(fā)送通知,就導(dǎo)致這個(gè)字段的值分布非常不均,大約有 50% 的值都是 admin,剩下的 50% 則是其他普通用戶,那么查詢的時(shí)候,據(jù)此字段建立的聯(lián)合索引,如果查詢條件不是 admin,則過濾效果不錯(cuò),如果查詢條件是 admin,則過濾效果就非常差。對(duì)于這樣的問題,我們就需要從業(yè)務(wù)上去解決,例如禁止根據(jù) admin 去查詢等等。總之,建立聯(lián)合索引時(shí),我們前面所所說的字段選擇性最高的原則,并不是放之四海而皆準(zhǔn)的,小伙伴們還是要具體情況具體分析。

3. 注意事項(xiàng)

由于聯(lián)合索引也是存儲(chǔ)在 B+Tree 中,如 1.1 小節(jié)圖示,username 在整棵 B+Tree 中是有序的,但是從整體上來(lái)看,age 是無(wú)序的,所以對(duì)于聯(lián)合索引在搜索的時(shí)候,需要滿足最做匹配原則才是有效的,否則會(huì)失效。舉例來(lái)說,如果查詢條件里只有 age,則索引就會(huì)失效,因?yàn)轫樦饕?B+Tree 去查詢滿足條件的記錄,得一個(gè)一個(gè)找,還不如直接遍歷主鍵索引。

標(biāo)簽:

資訊播報(bào)

樂活HOT

  • 《熊出沒·伴我“熊芯”》票房破10億 打破內(nèi)地影史春節(jié)檔動(dòng)畫片紀(jì)錄
    《熊出沒·伴我“熊芯”》票房破

    據(jù)各方數(shù)據(jù),1月31日上午10時(shí)許,深圳出品的動(dòng)畫電影《熊出沒·伴我熊芯》票房突破10億元,在首日票房、檔期票房、連續(xù)破億天數(shù)等多方面打

  • 今年春節(jié)深圳游客出境游訂單量大幅增加 曼谷等地成為最受歡迎目的地
    今年春節(jié)深圳游客出境游訂單量大

    1月27日,攜程發(fā)布的《2023年春節(jié)旅游總結(jié)報(bào)告》顯示,今年春節(jié),深圳游客的出境游訂單量同比去年增長(zhǎng)近5倍。相較國(guó)內(nèi)熱門景點(diǎn)的人山人海,

  • 2023年春節(jié)黃金周深圳共接待游客469.25萬(wàn)人次 旅游收入31.58億元
    2023年春節(jié)黃金周深圳共接待游客

    1月27日,記者從深圳市文化廣電旅游體育局獲悉,2023年春節(jié)黃金周期間(1月21日至27日),深圳共接待游客469 25萬(wàn)人次,旅游收入31 58億元,

  • 深圳機(jī)場(chǎng)連續(xù)多日客流量超過10萬(wàn)人次 衛(wèi)星廳迎來(lái)首個(gè)大客流春運(yùn)
    深圳機(jī)場(chǎng)連續(xù)多日客流量超過10萬(wàn)

    據(jù)深圳市春運(yùn)辦統(tǒng)計(jì),1月15日和16日連續(xù)兩天,深圳對(duì)外發(fā)送旅客人數(shù)都在48萬(wàn)左右,春運(yùn)進(jìn)入客流高峰期。1月15日,深圳春運(yùn)對(duì)外旅客發(fā)送量達(dá)

  • 深圳交響樂團(tuán)將將舉辦兩場(chǎng)音樂會(huì) 以世界經(jīng)典管弦樂和歌劇詠嘆調(diào)為主
    深圳交響樂團(tuán)將將舉辦兩場(chǎng)音樂會(huì)

    新年音樂會(huì)是觀眾喜聞樂見的年度重要文化品牌活動(dòng),多年來(lái)已成為深圳市民跨歲迎新的例牌項(xiàng)目。12月30日、31日晚,深圳交響樂團(tuán)將在深圳音樂

  • 深圳大力推進(jìn)實(shí)施人才強(qiáng)市戰(zhàn)略 深圳市人才總量已達(dá)到663萬(wàn)人
    深圳大力推進(jìn)實(shí)施人才強(qiáng)市戰(zhàn)略

    作為來(lái)深科研人員中的一員,中山大學(xué)附屬第八醫(yī)院的助理研究員郭雅婕對(duì)深圳在人才服務(wù)方面的舉措贊不絕口:我作為基礎(chǔ)研究人員,很希望自己

  • 2023年故宮年票正式開售 有消費(fèi)者目前仍對(duì)購(gòu)買年票持觀望態(tài)度
    2023年故宮年票正式開售 有消費(fèi)

    12月1日晚8點(diǎn),2023年故宮年票正式開售。相比于去年,今年購(gòu)票順暢了許多。據(jù)了解,2022年故宮年票發(fā)售時(shí),因短時(shí)間內(nèi)購(gòu)買年票人數(shù)過多,曾

  • 御寒類商品消費(fèi)需求有所上升 羽絨服的整體銷售額同比增長(zhǎng)達(dá)100%
    御寒類商品消費(fèi)需求有所上升 羽

    昨日,冷空氣到達(dá),廣州氣溫逐步下降。據(jù)商超方面預(yù)測(cè),隨著氣溫的逐漸下降,市民對(duì)于御寒類商品消費(fèi)需求有所上升,不少?gòu)V州商超準(zhǔn)備了有關(guān)

  • 深圳全市共排查窨井蓋約350萬(wàn)個(gè) 發(fā)現(xiàn)存在問題的窨井蓋約3.2萬(wàn)個(gè)
    深圳全市共排查窨井蓋約350萬(wàn)個(gè)

    小井蓋、大民生。今年以來(lái),深圳開展全市窨井蓋專項(xiàng)治理工作成效顯著。截至11月20日,全市共排查窨井蓋約350萬(wàn)個(gè),發(fā)現(xiàn)存在問題的窨井蓋約3

  • 汕汕鐵路汕頭站公布最新動(dòng)態(tài) 首期工程預(yù)計(jì)將于2024年11月完成
    汕汕鐵路汕頭站公布最新動(dòng)態(tài) 首

    備受關(guān)注的汕汕(汕頭至汕尾)鐵路汕頭站及站區(qū)工程近日傳出最新動(dòng)態(tài):項(xiàng)目已順利完成工程招標(biāo)工作,由中鐵建設(shè)集團(tuán)有限公司中標(biāo)承建。目前,

娛樂LOVE

精彩推送

主站蜘蛛池模板: 国产a视频 | 欧美一区=区三区 | h视频在线看 | 黄色特一级片 | 相泽亚洲一区中文字幕 | 日本欧美一区二区三区视频麻豆 | 成人羞羞免费视频 | 成人速播影院在线播放免费 | 欧美一级第一免费高清 | 久草三级 | 丝袜美女足淫美足美脚网站 | 在线免费观看亚洲视频 | 99精品免费在线观看 | 91精品欧美一区二区综合在线 | 国产91精品系列在线观看 | 亚洲午夜精品 | 午夜视频在线观看国产www | 一级毛片免费毛片毛片 | 黄色aqq| 中文字幕久久亚洲一区 | 国产综合久久久久 | 亚洲一区2区三区4区5区 | 欧美中文小说在线观看 | 国产成人理在线观看视频 | 午夜三级在线 | 日韩伦理片在线 | 免费一看一级毛片人 | 欧美二区在线观看 | 午夜看片影院在线观看 | 2019av在线视频 | 黄网址在线 | 国产农村精品一级毛片视频 | 日韩欧美中文字幕在线视频 | 高清不卡日本v在线二区 | 毛片动态图 | 午夜网站在线播放 | 国产精品麻豆免费版 | 欧美成人二区 | 一区在线免费 | 国产成人高清精品免费软件 | 中国毛片网 |