亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        MySQL索引是如何形成的

        2022-10-20 15:38:18金瀾
        關(guān)鍵詞:主鍵鍵值鏈表

        ■金瀾

        MySQL查詢過(guò)程的瓶頸在于磁盤(pán)IO,那怎么降低磁盤(pán)IO次數(shù)呢?答案就是索引。

        正確的使用索引,就能有效地把磁盤(pán)IO的次數(shù)降到常數(shù)級(jí),這樣查詢速度將會(huì)變得非???。

        無(wú)索引時(shí),為什么查詢會(huì)很慢?

        在磁盤(pán)中,MySQL存放數(shù)據(jù)的基本單位是數(shù)據(jù)頁(yè),數(shù)據(jù)是放在數(shù)據(jù)頁(yè)中的,每個(gè)數(shù)據(jù)頁(yè)中都有很多的數(shù)據(jù)行。在數(shù)據(jù)頁(yè)的數(shù)據(jù)區(qū)中存放著很多數(shù)據(jù)行,這些數(shù)據(jù)行就對(duì)應(yīng)數(shù)據(jù)表中的一行行數(shù)據(jù),它們都是通過(guò)單向鏈表方式連接組合起來(lái)的。而多個(gè)數(shù)據(jù)頁(yè)之間又是通過(guò)雙向鏈表的方式連接起來(lái)的。

        一個(gè)數(shù)據(jù)頁(yè)的大小默認(rèn)為16 KB,16 KB的大小肯定是不可能放得下一整張表的數(shù)據(jù)的,所以MySQL表中的數(shù)據(jù),比如訂單表中的訂單數(shù)據(jù),會(huì)通過(guò)這樣雙向鏈表的結(jié)構(gòu)放在多個(gè)數(shù)據(jù)頁(yè)中。

        如果要查詢一條數(shù)據(jù),就要沿著雙向鏈表一個(gè)個(gè)去尋找。比如,要查詢主鍵為1的那條數(shù)據(jù),可從數(shù)據(jù)頁(yè)1開(kāi)始查詢。

        首先,將數(shù)據(jù)頁(yè)1從磁盤(pán)中加載到MySQL內(nèi)存中,如果發(fā)現(xiàn)數(shù)據(jù)頁(yè)1中沒(méi)有想要的那條數(shù)據(jù),就要沿著雙向鏈表一直尋找下去。

        最糟糕的情況就是沿著數(shù)據(jù)頁(yè)1、數(shù)據(jù)頁(yè)2、一直到最后,在最后一個(gè)數(shù)據(jù)頁(yè)中才找到想要的那條數(shù)據(jù),但在這之前,我們得要把數(shù)據(jù)頁(yè)1一直到數(shù)據(jù)頁(yè)100,將這100個(gè)數(shù)據(jù)頁(yè)通過(guò)磁盤(pán)IO加載到內(nèi)存中,相當(dāng)于是全表掃描。

        就算MySQL中有預(yù)讀機(jī)制存在,可能會(huì)預(yù)先發(fā)生幾次磁盤(pán)IO,提前加載一些數(shù)據(jù)頁(yè)到內(nèi)存中,但這100個(gè)數(shù)據(jù)頁(yè)至少會(huì)導(dǎo)致幾十次磁盤(pán)IO,而磁盤(pán)IO這個(gè)過(guò)程很耗費(fèi)性能。

        MySQL的索引是如何形成的呢?

        那有沒(méi)有什么辦法,能夠讓我們盡量快定位到數(shù)據(jù)頁(yè),而不至于全表掃描呢?

        這件事,就要交給索引來(lái)處理了。

        順著數(shù)據(jù)頁(yè)的雙向鏈表數(shù)據(jù)結(jié)構(gòu)一個(gè)個(gè)去尋找,未免顯得太費(fèi)力了,我們可以為每個(gè)數(shù)據(jù)頁(yè)創(chuàng)建一個(gè)目錄,查詢數(shù)據(jù)時(shí),先到目錄里看一下有沒(méi)有自己想要的數(shù)據(jù),這樣不就快很多了嗎。

        首先看下數(shù)據(jù)頁(yè)內(nèi)部的構(gòu)造:

        比如,以數(shù)據(jù)頁(yè)1舉例,數(shù)據(jù)頁(yè)1中有很多的數(shù)據(jù)行,數(shù)據(jù)行之間都是用指針連接,并且以單向鏈表的方式組織起來(lái)的,并且單向鏈表中主鍵一定是有序的,無(wú)序的數(shù)據(jù)是沒(méi)法創(chuàng)建索引的。

        數(shù)據(jù)行前面的0、2、3表示記錄的類型,也就是數(shù)據(jù)行的類型,0表示普通類型,就是表中的一行普通數(shù)據(jù),2表示最小記錄,3表示最大記錄,因?yàn)閿?shù)據(jù)行對(duì)應(yīng)的主鍵都是有順序的。這里為了方便展示索引,假設(shè)每個(gè)數(shù)據(jù)頁(yè)中都有20條數(shù)據(jù),當(dāng)我們建立索引之后,可以看到,索引頁(yè)中會(huì)記錄每個(gè)數(shù)據(jù)頁(yè)中最小的主鍵即ID的值,以及對(duì)應(yīng)的數(shù)據(jù)頁(yè)號(hào),而索引頁(yè)就發(fā)揮了數(shù)據(jù)頁(yè)目錄的效果。

        索引頁(yè)其實(shí)也是數(shù)據(jù)頁(yè),只不過(guò)是我們拿來(lái)專門(mén)存放數(shù)據(jù)頁(yè)的目錄信息而已。索引頁(yè)中的記錄類型,除了2和3之外還有1,1表示的是目錄的類型,因?yàn)樗侵赶蚓唧w的某個(gè)數(shù)據(jù)頁(yè)。

        而如果數(shù)據(jù)頁(yè)很多的話,一個(gè)索引頁(yè)中肯定就放不下,此時(shí),MySQL會(huì)把超出索引頁(yè)的目錄信息放到新的索引頁(yè)中,然后向上再擴(kuò)展出一個(gè)索引頁(yè)。這時(shí)數(shù)據(jù)頁(yè)3和數(shù)據(jù)頁(yè)4的目錄信息,被放到了索引頁(yè)2中,然后索引3作為擴(kuò)展出來(lái)的索引頁(yè),記錄索引頁(yè)1和索引頁(yè)2中的最小主鍵值以及索引頁(yè)號(hào),也就是說(shuō)索引頁(yè)3中記錄的信息,就相當(dāng)于更上一層索引的目錄信息了。

        如果索引頁(yè)3中的容量也不夠了,這個(gè)時(shí)候,同樣會(huì)把超出索引頁(yè)3的信息,放到新的一個(gè)同層級(jí)的索引頁(yè)中,然后再向上擴(kuò)展一層。在索引頁(yè)3中的信息放不下之后,就會(huì)放到索引頁(yè)4中,然后向上再拓展一層索引5,索引5中存放的就是索引3和索引4的目錄信息,規(guī)律都是一樣的。

        索引頁(yè)逐層的往上擴(kuò)展,看起來(lái)就像一棵樹(shù)一樣,這也就是我們經(jīng)常說(shuō)的B+索引樹(shù),3層索引一般就可以存放千萬(wàn)級(jí)別的數(shù)據(jù)了。

        為什么利用索引查詢就能變快呢?

        有了索引之后,如果要查詢主鍵為1的那條數(shù)據(jù),就可以從B+索引樹(shù)最上面的那個(gè)索引頁(yè)開(kāi)始查詢。可以把索引頁(yè)5先加載到內(nèi)存,此時(shí)會(huì)發(fā)生一次磁盤(pán)IO,然后再通過(guò)二分法,根據(jù)主鍵值1,到索引頁(yè)5中快速的和各個(gè)目錄項(xiàng)中的最小主鍵值對(duì)比一下,然后找到下一個(gè)索引頁(yè)3,通過(guò)索引頁(yè)3又可以定位到下一個(gè)索引頁(yè)1。

        在這顆B+索引樹(shù)中,通過(guò)二分法對(duì)比最小主鍵值的方式,最終在索引頁(yè)1中發(fā)現(xiàn),原來(lái)主鍵值為1的那條數(shù)據(jù),是位于數(shù)據(jù)頁(yè)1中。此時(shí),就可以針對(duì)性地把數(shù)據(jù)頁(yè)1加載到內(nèi)存,然后在內(nèi)存中就可以查到主鍵為1的數(shù)據(jù)了。

        這樣的方式不需要像無(wú)索引一樣全表掃描,挨個(gè)加載數(shù)據(jù)頁(yè)到內(nèi)存中,而是利用索引頁(yè),通過(guò)高效的二分法查找,很快就可以定位到數(shù)據(jù)具體是在哪個(gè)數(shù)據(jù)頁(yè)中。

        在這個(gè)過(guò)程中就算是上千萬(wàn)級(jí)別的數(shù)據(jù)量,也可以做到只發(fā)生個(gè)位數(shù)磁盤(pán)IO,就可以查詢到數(shù)據(jù),這也是為什么用了索引之后查詢的效率明顯提高的原因。

        所以,SQL優(yōu)化,關(guān)鍵在于要想辦法讓SQL語(yǔ)句能利用索引查數(shù)據(jù),這樣的話查詢的效率才會(huì)上來(lái),但是有時(shí)會(huì)有很多因素,導(dǎo)致不能讓SQL語(yǔ)句使用索引,這也是SQL優(yōu)化的一個(gè)關(guān)鍵點(diǎn)。

        猜你喜歡
        主鍵鍵值鏈表
        基于Go 實(shí)現(xiàn)的分布式主鍵系統(tǒng)研究
        非請(qǐng)勿進(jìn) 為注冊(cè)表的重要鍵值上把“鎖”
        基于外鍵的E-R圖繪制方法研究
        基于二進(jìn)制鏈表的粗糙集屬性約簡(jiǎn)
        跟麥咭學(xué)編程
        基于鏈表多分支路徑樹(shù)的云存儲(chǔ)數(shù)據(jù)完整性驗(yàn)證機(jī)制
        一鍵直達(dá) Windows 10注冊(cè)表編輯高招
        鏈表方式集中器抄表的設(shè)計(jì)
        數(shù)據(jù)庫(kù)主鍵的設(shè)計(jì)方法探討
        注冊(cè)表值被刪除導(dǎo)致文件夾選項(xiàng)成空白
        国产精品黄色片在线看| 亚洲中文字幕无码久久2020| 性动态图av无码专区| 欧美综合区| 久久精品国产乱子伦多人| 亚洲中文字幕在线第二页| 亚洲乱码av中文一区二区第八页| 精品无码一区二区三区的天堂| 日韩精品极品视频在线观看免费| 欧美成人一区二区三区在线观看| 国产在视频线精品视频二代| av网站免费观看入口| 强d乱码中文字幕熟女免费| 亚洲欧洲国产成人综合在线| 午夜成人鲁丝片午夜精品| 亚洲精品毛片一区二区三区| 亚洲精品国产综合久久一线| 日韩女优视频网站一区二区三区| 欧美激情一区二区三区| 中文字幕人妻熟女人妻洋洋| 尤物99国产成人精品视频| 中文字幕人成乱码中文乱码| 成人大片免费观看视频| 人妻少妇久久中文字幕| a级毛片免费观看在线| 国产美熟女乱又伦av果冻传媒| 人妻少妇精品一区二区三区| 在线观看国产白浆一区三区| 亚洲a∨国产av综合av下载| 装睡被陌生人摸出水好爽| 宅宅午夜无码一区二区三区| 亚洲熟女少妇一区二区三区青久久 | 色一情一乱一伦一区二区三区日本| 四虎影视久久久免费| 成人女同av免费观看| 日本高清一级二级三级| 国产成人精品a视频| 欧美中文在线观看| 国产av天堂亚洲国产av麻豆| 日本最新视频一区二区| 国产农村乱辈无码|