一澎迎、索引
1乱投、什么是索引
索引在MySQL中也叫做“鍵”送爸,是存儲引擎用于快速找到記錄的一種數(shù)據(jù)結(jié)構(gòu)铛嘱。索引對于良好的性能非常關(guān)鍵暖释,尤其是當表中的數(shù)據(jù)量越來越大時,索引對于性能的影響愈發(fā)重要墨吓。索引優(yōu)化應該是對查詢性能優(yōu)化最有效的手段了球匕。索引能夠輕易將查詢性能提高好幾個數(shù)量級。索引相當于字典的音序表帖烘,如果要查某個字亮曹,如果不使用音序表,則需要從幾百頁中逐頁去查秘症。
本質(zhì)都是:通過不斷地縮小想要獲取數(shù)據(jù)的范圍來篩選出最終想要的結(jié)果照卦,同時把隨機的事件變成順序的事件,也就是說乡摹,有了這種索引機制役耕,我們可以總是用同一種查找方式來鎖定數(shù)據(jù)。
使用索引是為了提升查詢效率聪廉,索引通常建在id這樣區(qū)分度高的字段上瞬痘,過多的添加索引會降低數(shù)據(jù)存入速度。索引的數(shù)據(jù)結(jié)構(gòu)是一顆b+數(shù)板熊,索引的字段要盡量的小图云,因為數(shù)據(jù)項占的空間越小,數(shù)據(jù)項的數(shù)量越多邻邮,樹的高度越低竣况,而索引查詢的I/O次數(shù)和樹的高度有關(guān)。
2筒严、索引的最左匹配特性
當b+樹的數(shù)據(jù)項是復合的數(shù)據(jù)結(jié)構(gòu)丹泉,比如(name,age,sex)的時候,b+數(shù)是按照從左到右的順序來建立搜索樹的鸭蛙,比如當(張三,20,F)這樣的數(shù)據(jù)來檢索的時候摹恨,b+樹會優(yōu)先比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex娶视,最后得到檢索的數(shù)據(jù)晒哄;但當(20,F)這樣的沒有name的數(shù)據(jù)來的時候,b+樹就不知道下一步該查哪個節(jié)點肪获,因為建立搜索樹的時候name就是第一個比較因子寝凌,必須要先根據(jù)name來搜索才能知道下一步去哪里查詢。比如當(張三,F)這樣的數(shù)據(jù)來檢索時孝赫,b+樹可以用name來指定搜索方向较木,但下一個字段age的缺失,所以只能把名字等于張三的數(shù)據(jù)都找到青柄,然后再匹配性別是F的數(shù)據(jù)了伐债, 這個是非常重要的性質(zhì)预侯,即索引的最左匹配特性。
3峰锁、聚集索引
聚集索引就是按照每張表的主鍵構(gòu)造一棵B+樹萎馅,同時葉子節(jié)點中存放的即為整張表的行記錄數(shù)據(jù)。
優(yōu)點:
- 對主鍵的排序查找和范圍查找速度非澈缃快校坑,葉子節(jié)點的數(shù)據(jù)就是用戶所要查詢的數(shù)據(jù)。
- 范圍查詢(range query)千诬,即如果要查找主鍵某一范圍內(nèi)的數(shù)據(jù)耍目,通過葉子節(jié)點的上層中間節(jié)點就可以得到頁的范圍,之后直接讀取數(shù)據(jù)頁即可徐绑。
4邪驮、輔助索引
表中除了聚集索引外其他索引都是輔助索引(Secondary Index,也稱為非聚集索引)傲茄,與聚集索引的區(qū)別是:輔助索引的葉子節(jié)點不包含行記錄的全部數(shù)據(jù)毅访。葉子節(jié)點除了包含鍵值以外,每個葉子節(jié)點中的索引行中還包含一個書簽(bookmark)盘榨。該書簽用來告訴InnoDB存儲引擎去哪里可以找到與索引相對應的行數(shù)據(jù)喻粹。輔助索引的存在并不影響數(shù)據(jù)在聚集索引中的組織,因此每張表上可以有多個輔助索引草巡,但只能有一個聚集索引守呜。當通過輔助索引來尋找數(shù)據(jù)時,InnoDB存儲引擎會遍歷輔助索引并通過葉子級別的指針獲得只想主鍵索引的主鍵山憨,然后再通過主鍵索引來找到一個完整的行記錄查乒。
5、覆蓋索引
InnoDB存儲引擎支持覆蓋索引郁竟,即從輔助索引中就可以得到查詢的記錄玛迄,而不需要查詢聚集索引中的記錄。
優(yōu)點:
- 1棚亩、可以減少大量IO操作
- 2蓖议、有助于統(tǒng)計
6、聯(lián)合索引
聯(lián)合索引時指對表上的多個列合起來做一個索引讥蟆。聯(lián)合索引的創(chuàng)建方法與單個索引的創(chuàng)建方法一樣勒虾,不同之處在僅在于有多個索引列。好處是在第一個鍵相同的情況下攻询,已經(jīng)對第二個鍵進行了排序處理从撼。
7州弟、常用索引
普通索引INDEX:加速查找
唯一索引:
- 主鍵索引PRIMARY KEY:加速查找+約束(不為空钧栖、不能重復)
- 唯一索引UNIQUE:加速查找+約束(不能重復)
聯(lián)合索引:
- PRIMARY KEY(id,name):聯(lián)合主鍵索引
- UNIQUE(id,name):聯(lián)合唯一索引
- INDEX(id,name):聯(lián)合普通索引
二低零、慢查詢優(yōu)化的基本步驟
- 先運行看看是否真的很慢,注意設(shè)置SQL_NO_CACHE
- where條件單表查拯杠,鎖定最小返回記錄表掏婶。這句話的意思是把查詢語句的where都應用到表中返回的記錄數(shù)最小的表開始查起,單表每個字段分別查詢潭陪,看哪個字段的區(qū)分度最高
- explain查看執(zhí)行計劃雄妥,是否與1預期一致(從鎖定記錄較少的表開始查詢)
- order by limit 形式的sql語句讓排序的表優(yōu)先查
- 了解業(yè)務(wù)方使用場景
- 加索引時參照建索引的幾大原則
- 觀察結(jié)果,不符合預期繼續(xù)從0分析