前面一篇文章,松哥和大家聊了 MySQL 中的索引合并,雖然 MySQL 提供了索引合并機制來提升 SQL 執行的效率,然而在具體實踐中,如果能避免發生索引合并是最好的,畢竟這是沒辦法的辦法,是一個下下策。發生索引合并大概率是因為我們索引在設計的時候就有問題,設計好聯合索引,我們就能在一定程度上避免發生索引合并問題。
(資料圖片僅供參考)
聯合索引就是數據表中的多個字段,共同組成一個索引。由于 InnoDB 中索引的數據結構是一個 B+Tree,當是一個聯合索引的時候,排序的時候會首先按照聯合索引的第一個字段排序,如果第一個字段的值相同,則按照第二個字段排序,如果第二個字段的值也相同,則按照第三個字段排序,以此類推。
舉一個簡單的例子,假設我有如下數據:
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 | 深圳 | 男 |
現在我給 username 和 age 字段建立聯合索引,那么 B+Tree 在排序的時候,會首先按照 username 排序,當 username 相同的時候,再按照 age 進行排序。畫出來的 B+Tree 如下圖:
如上圖,bw 相同的時候,按照 age 進行排序。
如果我們想要在 MySQL 中,讓聯合索引發揮最大作用,就要充分考慮到聯合索引中各字段的順序。
1.2 聯合索引順序要考慮哪些因素?在設計聯合索引的時候,我們最容易想到的原則是查詢條件影響了聯合索引中各個字段的順序,要根據查詢條件來設計聯合索引中各個字段的順序。
實際上,除了上面提到的查詢條件之外,聯合索引的順序還會影響到查詢的排序和分組等,所以,設計聯合索引的順序可以算是一個真真正正的技術活。
2. 案例分析松哥這里還是使用官方的案例吧,小伙伴們在公眾號后臺回復mysql官方案例可以獲取到這個數據庫腳本的下載地址。
在 MySQL 的官方案例中,有一個支付表 payment,如下圖:
小伙伴們從圖中可以看到,這個表中有一個 customer_id 和一個 staff_id,現在假設我想要按照這兩個來進行搜索,例如執行如下 SQL:
select * from payment where customer_id=1 and staff_id=2;
查詢條件有兩個,我想建立一個聯合索引,那么究竟是把 customer_id 放在前面還是把 staff_id 放在前面呢?
一個比較常用的法則是看字段的選擇性,選擇性高的字段應該是放在前面。有的小伙伴可能還不清楚什么是字段的選擇性,可以參考松哥之前的文章:前綴索引,在性能和空間中尋找平衡。
那么怎么獲取各個字段的選擇性呢?這個很好計算,一個 SQL 搞定,如下:
select count(distinct customer_id)/count(1) as c,count(distinct staff_id)/count(1) as s from payment;
執行結果如下:
可以看到,customer_id 的選擇性為 0.0373,而 staff_id 的選擇性為 0.0001,那么在建立聯合索引的時候,將 customer_id 放在第一列顯然更合適一些,因為它的選擇性更高(意味著字段里邊重復的值相對來說會少一些),根據 customer_id 更容易鎖定一行,查詢效率要更高一些。
不過需要注意,上面的法則并非放之四海而皆準,還是要具體問題具體分析。在一些特別極端的情況下,索引選擇性非常之低,那個時候就沒有必要建立聯合索引了。特殊情況甚至需要我們從業務邏輯上去解決。
松哥舉一個例子來說明這個問題。
3. 注意事項在我第一版的 vhr 中,當時有一個系統通知的功能,就是管理員可以給所有的用戶群發消息。用戶之間也可以互發消息,如果發送消息的時候,用戶不在線,就需要先把消息存到數據庫中,等用戶上線了再推給用戶,那么就需要一張表來保存消息。這個表中有一個字段就是消息發送者,由于網站經常需要發送通知,就導致這個字段的值分布非常不均,大約有 50% 的值都是 admin,剩下的 50% 則是其他普通用戶,那么查詢的時候,據此字段建立的聯合索引,如果查詢條件不是 admin,則過濾效果不錯,如果查詢條件是 admin,則過濾效果就非常差。對于這樣的問題,我們就需要從業務上去解決,例如禁止根據 admin 去查詢等等。總之,建立聯合索引時,我們前面所所說的字段選擇性最高的原則,并不是放之四海而皆準的,小伙伴們還是要具體情況具體分析。
由于聯合索引也是存儲在 B+Tree 中,如 1.1 小節圖示,username 在整棵 B+Tree 中是有序的,但是從整體上來看,age 是無序的,所以對于聯合索引在搜索的時候,需要滿足最做匹配原則才是有效的,否則會失效。舉例來說,如果查詢條件里只有 age,則索引就會失效,因為順著索引的 B+Tree 去查詢滿足條件的記錄,得一個一個找,還不如直接遍歷主鍵索引。
標簽:
據各方數據,1月31日上午10時許,深圳出品的動畫電影《熊出沒·伴我熊芯》票房突破10億元,在首日票房、檔期票房、連續破億天數等多方面打
1月27日,攜程發布的《2023年春節旅游總結報告》顯示,今年春節,深圳游客的出境游訂單量同比去年增長近5倍。相較國內熱門景點的人山人海,
1月27日,記者從深圳市文化廣電旅游體育局獲悉,2023年春節黃金周期間(1月21日至27日),深圳共接待游客469 25萬人次,旅游收入31 58億元,
據深圳市春運辦統計,1月15日和16日連續兩天,深圳對外發送旅客人數都在48萬左右,春運進入客流高峰期。1月15日,深圳春運對外旅客發送量達
新年音樂會是觀眾喜聞樂見的年度重要文化品牌活動,多年來已成為深圳市民跨歲迎新的例牌項目。12月30日、31日晚,深圳交響樂團將在深圳音樂
作為來深科研人員中的一員,中山大學附屬第八醫院的助理研究員郭雅婕對深圳在人才服務方面的舉措贊不絕口:我作為基礎研究人員,很希望自己
12月1日晚8點,2023年故宮年票正式開售。相比于去年,今年購票順暢了許多。據了解,2022年故宮年票發售時,因短時間內購買年票人數過多,曾
昨日,冷空氣到達,廣州氣溫逐步下降。據商超方面預測,隨著氣溫的逐漸下降,市民對于御寒類商品消費需求有所上升,不少廣州商超準備了有關
小井蓋、大民生。今年以來,深圳開展全市窨井蓋專項治理工作成效顯著。截至11月20日,全市共排查窨井蓋約350萬個,發現存在問題的窨井蓋約3
備受關注的汕汕(汕頭至汕尾)鐵路汕頭站及站區工程近日傳出最新動態:項目已順利完成工程招標工作,由中鐵建設集團有限公司中標承建。目前,
市南巴士司機拾金不昧,老人事后送錦
近日,市民李女士來到青島城運控股公交集團市南巴士三分公司,將一面印有“拾金不昧品德高尚”的錦旗親手送
環球速遞!重要提醒!青島小升初報名
5月4日,青島市內三區小學畢業生開始進行小升初志愿填報,今年依舊是公民同招。作為第一階段的青島實驗初中
假期客流火爆!青島地鐵共計加開168
今年“五一”小長假是防疫政策調整后的第一個旅游旺季。綜合5天小長假來看,今年“五一”期間,全市公共交
青島2023櫻桃節5月6日開幕!尋找最美
5月4日,記者從嶗山區北宅街道辦獲悉,青島2023櫻桃節暨第二十八屆北宅櫻桃節即將于5月6日(本周六)開幕,
北京-青島軌道展暨首屆城軌高交會開
以“智賦城軌、綠色發展”為主題,2022北京-青島國際城市軌道交通展覽會暨高峰論壇于4月27日-29日在青島舉
全球觀速訊丨特斯拉中國上調全新 Mo
調整后,ModelS起售價808,900元,ModelX起售價898,900元 具體來看,ModelS全輪驅動版由789,900
Stein:猛龍今日就主帥一職面試了雄
據名記MarcStein報道,消息人士透露,雄鹿助教查爾斯-李今日接受了猛龍主帥一職的面試。據此前報道,查爾斯
詹姆斯首節爆砍14分 創個人5年來季
直播吧5月5日訊??NBA季后賽西部半決賽G2,湖人客場對陣勇士。本場比賽首節,詹姆斯狀態爆棚,他單節8投6
CBA打進總決賽有多難?浙江拼了28年
浙江隊在CBA半決賽G5戰以1分的優勢險勝深圳隊,成功打進總決賽,這也是他們隊史第一次打進總決賽。自從1995
理事長_關于理事長介紹
理事長,關于理事長介紹這個很多人還不知道,我們一起來看看!1、理事長,韓國劇情電影《女教師》中的角色,
為什么山東人大都喜歡吃蒜和蔥?山東
為什么山東人大都喜歡吃蒜和蔥?山東之所以有愛吃蔥蒜的習俗,最大的原因還是這里盛產蔥蒜。蔥和蒜比其他農作物更容易種植。山東地區自古以
省應急管理廳發出通知:要求強化汛期
省應急管理廳發出通知:要求強化汛期煤礦安全防范工作措施,主流媒體,山西門戶。山西新聞網是經國務院新聞辦
冰球比賽每場持續多少分鐘?冰球比賽
冰球比賽每場持續多少分鐘?冰球比賽將持續60分鐘,分為三組,每組20分鐘,兩組之間休息15分鐘;如果雙方平手,將進入加時賽,采用金球制勝法;然而
椰子螺里的珠子叫什么名字呢??椰子
椰子螺里的珠子叫什么名字呢?椰子螺里面的珠子叫美樂珠,這種珠子又被稱為龍珠或者是火焰珠,主要產自海螺類產品的體內,但是卻無法通過人工養
小寒代表的寓意是什么意思?小寒節氣
小寒代表的寓意是什么意思?小寒代表寓意:開始進入一年中最寒冷的日子。 小寒是二十四節氣中的第二十三個節氣,冬季第五個節氣,在每年的1月5
噴氣式飛機的飛行原理是什么?第一架
噴氣式飛機的飛行原理是什么?噴氣式飛機原理:利用牛頓反作用力的第三定律。首先,發動機前邊配有空氣壓縮機,現代壓縮機分成7--9級,壓縮機轉
噴氣式飛機時速多少千米每小時?中國
噴氣式飛機時速多少千米每小時?一般的噴氣式飛機每小時能飛行大約900KM,大型噴氣式飛機達到1000KM每小時。噴氣式飛機的問世,將航速一下子提
課后服務 豐富多彩
天津北方網訊:近日,天津市義務教育階段學校課后服務互比互看展示交流活動在和平區萬全小學舉行。活動展示
蒲式耳是哪個國家的計量單位?一蒲式
蒲式耳是哪個國家的計量單位?蒲式耳(英語:bushel)是英制的容量及重量單位,在英國及美國通用,主要用于量度干貨,尤其是農產品的重量。通常1蒲
加侖究竟是哪個國家的計量單位?一個
加侖是哪個國家的計量單位?加侖是一種容(體)積單位,英文全稱gallon,簡寫gal。加侖又分為英制加侖和美制加侖,兩者表示的大小不一樣。英制加
天天亮點!理書_關于理書介紹
理書,關于理書介紹這個很多人還不知道,我們一起來看看!1、理書,漢語詞語,讀音lǐshū。2、意思是處理文
奎克利:我曾在狀態低迷時向庫里尋求
近日,尼克斯球員奎克利接受了《SLAM》專訪。奎克利透露,在自己生涯的低迷時期,他曾向勇士球星庫里尋求投
南京空港口岸出入境人次占全省78%
“五一”假期全省出入境旅客流量激增120倍南京空港口岸出入境人次占全省78%5月4日,記者從江蘇出入境邊防檢
變陣!勇士G2首發:庫里克萊維金斯賈
勇士湖人G2首發出爐。勇士變陣,盧尼被撤到替補,杰邁克爾-格林被提上首發。勇士首發為:庫里、克萊、維金
【全球速看料】廣東加快推進森林康養
(記者 邵一弘通訊員 林蔭)森林康養是近年逐漸興起的林業產業新業態。廣東省2018年正式啟動培育廣東省森林
白云機場口岸高峰日2.4萬人次通關
(記者 汪棹桴通訊員 林圣敏周笑臣黎鋒俊)筆者從白云邊檢獲悉,“五一”假期,白云機場口岸共查驗出入境人
曝 PS5 Pro 即將研發完畢,首批開
緊接著,知名爆料者TomHenderson透露,索尼正在研發PS5Pro版,這款高端主機將于2024年底發布,并且開發套件
全球實時:理事會_關于理事會介紹
理事會,關于理事會介紹這個很多人還不知道,我們一起來看看!1、理事會,為協商、征求意見或討論問題而設立
全球速訊:狄龍下賽季下家賠率:熱火
據此前名記Shams報道,灰熊已告知狄龍-布魯克斯,任何情況下都不會與其續約,今日博彩網站更新了狄龍下賽季
假期客流火爆!青島地鐵共計加開168
今年“五一”小長假是防疫政策調整后的第一個旅游旺季。綜合5天小長假來看,今年“五一”期間,全市公共交