一、為什么使用索引:
索引是存儲(chǔ)引擎用于快速找到數(shù)據(jù)記錄的一種數(shù)據(jù)結(jié)構(gòu),就好比一本教課書(shū)的目錄部分,通過(guò)目錄中找到對(duì)應(yīng)文章的頁(yè)碼,便可快速定位到需要的文章。MySQL中也是一樣的道理,進(jìn)行數(shù)據(jù)査找時(shí),首先查看查詢(xún)條件是否命中某條索引,符合則通過(guò)索引査找相關(guān)數(shù)據(jù),如果不符合則需要全表掃描,即需要一條一條地查找記錄,直到找到與條件符合的記錄。
二、索引及其優(yōu)缺點(diǎn):
1.索引概述:索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。索引是數(shù)據(jù)結(jié)構(gòu),可以簡(jiǎn)單地理解為排好序的快速查找數(shù)據(jù)結(jié)構(gòu)。滿(mǎn)足特定查找算法,這些數(shù)據(jù)結(jié)構(gòu)以某種方式指向數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上實(shí)現(xiàn)高級(jí)查找算法。索引是在存儲(chǔ)引擎中實(shí)現(xiàn)的,因此每種存儲(chǔ)引擎的索引不一定完全相同,并且每種存儲(chǔ)引擎不一定支持所有索引類(lèi)型。同時(shí)存儲(chǔ)引擎可以定義每個(gè)表的最大索引數(shù)和最大索引長(zhǎng)度。
2.使用索引的優(yōu)點(diǎn):
(1)提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫(kù)的IO成本
(2)通過(guò)創(chuàng)建唯一索引,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性.
(3)在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面,可以加速表和表之間的連接。換句話說(shuō)對(duì)于有依賴(lài)關(guān)系的子表和父表聯(lián)合查詢(xún)時(shí),可以提高查詢(xún)速度。
(4)在使用分組和排序子句進(jìn)行數(shù)據(jù)查詢(xún)時(shí),可以顯著減少查詢(xún)中分組和排序的時(shí)間,降低了CPU的消耗.
3.使用索引的缺點(diǎn):
(1)創(chuàng)建索引和維護(hù)索引要 耗費(fèi)時(shí)間 ,并且隨著數(shù)據(jù)量的增加,所耗費(fèi)的時(shí)間也會(huì)增加。
(2)索引需要占磁盤(pán)空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間,存儲(chǔ)在磁盤(pán)上如果有大量的索引,索引文件就可能比數(shù)據(jù)文件更快達(dá)到最大文件尺寸。
(3)雖然索引大大提高了查詢(xún)速度,同時(shí)卻會(huì) 降低更新表的速度。當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)地維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。
三、Innodb中的索引方案:
1.迭代一次:目錄項(xiàng)記錄的頁(yè)
目錄項(xiàng)其實(shí)和用戶(hù)記錄差不多,只不過(guò)目錄項(xiàng)中的兩個(gè)列是主鍵和頁(yè)號(hào)。可以將表示目錄項(xiàng)的記錄稱(chēng)為目錄項(xiàng)記錄??梢允褂糜涗涱^信息里的record_type(0:普通的用戶(hù)記錄;1:目錄項(xiàng)記錄;2:最小記錄;3:最大記錄)區(qū)分用戶(hù)記錄和目錄項(xiàng)記錄。
目錄項(xiàng)記錄和用戶(hù)記錄的不同點(diǎn):
(1)目錄項(xiàng)記錄的record_type值是1,而普通用戶(hù)記錄的record_type值為0
(2)目錄項(xiàng)記錄只有主鍵值和頁(yè)的編號(hào)兩個(gè)列,而普通的用戶(hù)記錄的列是用戶(hù)自己定義的,可能包含很多對(duì)。另外還有InnoDB自己添加的隱藏列。
目錄項(xiàng)記錄和用戶(hù)記錄的相同點(diǎn):
(1)兩者用的是一樣的數(shù)據(jù)頁(yè),都會(huì)為主鍵生成Page Directory,從而在按照主鍵值進(jìn)行查找時(shí)可以使用二分法來(lái)加快查詢(xún)速度。
2.迭代2次:多個(gè)目錄項(xiàng)記錄的頁(yè)
?3.迭代3次:目錄項(xiàng)記錄頁(yè)的目錄頁(yè)
?4.B+Tree:
5.常見(jiàn)索引概念:
(1)聚簇索引:聚簇索引并不是一類(lèi)單獨(dú)的索引類(lèi)型,而是一種數(shù)據(jù)存儲(chǔ)方式(所有的用戶(hù)記錄都存儲(chǔ)在葉子節(jié)點(diǎn)),也就是所謂的索引即數(shù)據(jù),數(shù)據(jù)即索引。
特點(diǎn):
a.使用記錄主鍵值的大小記錄和頁(yè)的排序:頁(yè)內(nèi)的記錄是按照主鍵的大小順序排成一個(gè)單向鏈表;各個(gè)存放用戶(hù)記錄的值也是根據(jù)頁(yè)中用戶(hù)記錄的主鍵大小順序排成一個(gè)雙向鏈表;存放目錄項(xiàng)記錄的頁(yè)分為不同的層次,在同一層次中的頁(yè)也是根據(jù)頁(yè)中目錄記錄項(xiàng)的主鍵大小順序排成一個(gè)雙向鏈表;
b.B+數(shù)的葉子節(jié)點(diǎn)存儲(chǔ)的是完整的用戶(hù)記錄,包括隱藏列
優(yōu)點(diǎn):
a.數(shù)據(jù)訪問(wèn)更快,因?yàn)榫鄞厮饕龑⑺饕蛿?shù)據(jù)保存在同一個(gè)B+樹(shù)中,因此從聚簇索引中獲取數(shù)據(jù)比非聚簇索引更快;
b.聚簇索引對(duì)于主鍵的排序查找和范圍查找速度非常快
c.按照聚簇索引排列的順序,查詢(xún)一定范圍數(shù)據(jù)的時(shí)候,由于數(shù)據(jù)都是緊密相連的,數(shù)據(jù)庫(kù)不用從多個(gè)數(shù)據(jù)塊中提取數(shù)據(jù),所以可以節(jié)省大量的IO操作。
缺點(diǎn):
a.MyISAM不支持聚簇索引,只有InnoDB支持
b.每個(gè)MySQL的表只能有一個(gè)聚簇索引,一般情況下就是該表的主鍵
c.innodb表的主鍵列盡量選用有序的順序id
d.如果沒(méi)有定義主鍵,innodb會(huì)選擇非空的唯一索引代替,如果沒(méi)有這樣的索引,會(huì)隱式的定義一個(gè)主鍵來(lái)作為聚簇索引
(2)二級(jí)索引(輔助索引,非聚簇索引)
以非主鍵的列為查找條件,可以在該列上添加索引,此時(shí)的索引被稱(chēng)為二級(jí)索引
此時(shí)使用記錄c2列的大小進(jìn)行記錄和頁(yè)的排序:
a.頁(yè)內(nèi)記錄是按照c2列的大小順序排成一個(gè)單向鏈表
b.各個(gè)存放用戶(hù)記錄的頁(yè)也是根據(jù)頁(yè)中記錄的c2列的大小順序排成一個(gè)雙向鏈表
c.存放目錄項(xiàng)記錄的頁(yè)分為不同的層次,在同一層次中的頁(yè)也是根據(jù)頁(yè)中的目錄項(xiàng)記錄的c2列大小順序拍成一個(gè)雙向鏈表
B+樹(shù)的葉子節(jié)點(diǎn)此時(shí)存儲(chǔ)的并不是完整的用戶(hù)記錄,而是c2列和主鍵這兩個(gè)列的值
目錄項(xiàng)記錄中不再是主鍵和頁(yè)號(hào)的搭配,而變成c2列和頁(yè)號(hào)的搭配
當(dāng)按照c2列的值查找到完整的用戶(hù)記錄的話,仍然需要到聚簇索引中再查一遍,這個(gè)過(guò)程叫做回表。
聚簇索引和非聚簇索引的區(qū)別:
a.聚簇索引的葉子節(jié)點(diǎn)存儲(chǔ)的是數(shù)據(jù)記錄,非聚簇索引的葉子節(jié)點(diǎn)存儲(chǔ)的是數(shù)據(jù)位置,非聚簇索引不會(huì)影響數(shù)據(jù)表的物理存儲(chǔ)順序
b.一個(gè)表只能有一個(gè)聚簇索引,因?yàn)橹荒苡幸环N排序存儲(chǔ)的方式,但可以有多個(gè)非聚簇索引,也就是多個(gè)索引目錄提供數(shù)據(jù)檢索
c.使用聚簇索引的時(shí)候,數(shù)據(jù)的查詢(xún)效率高,但如果對(duì)數(shù)據(jù)進(jìn)行插入、刪除和更新等操作效率比非聚簇索引低。
(3)聯(lián)合索引
可以以多個(gè)列的大小作為排序規(guī)則,同時(shí)為多個(gè)列建立索引。
每條目錄項(xiàng)記錄都由c2,c3和頁(yè)號(hào)三個(gè)部分組成,各條記錄先按照c2列的值進(jìn)行排序,如果記錄的c2列相同,則按照c3列的值排序。
B+樹(shù)的葉子節(jié)點(diǎn)處的值由c2,c3和主鍵列組成。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-833231.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-833231.html
到了這里,關(guān)于MySQL學(xué)習(xí)Day19——索引的數(shù)據(jù)結(jié)構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!