索引是幫助數(shù)據(jù)庫高效獲取數(shù)據(jù)排好序的數(shù)據(jù)結(jié)構(gòu)
常用的存儲(chǔ)引擎innodb采用的是B+Tree
索引的數(shù)據(jù)結(jié)構(gòu) B+Tree (對(duì)于B-Tree的優(yōu)化)
二叉樹
紅黑樹
Hash表
B-Tree
其他數(shù)據(jù)結(jié)構(gòu)的弊端
二叉樹: 可能會(huì)退化成鏈表,會(huì)進(jìn)行全表掃描,數(shù)據(jù)量大的時(shí)候荣恐,樹的深度很深
紅黑樹:大數(shù)據(jù)下朵耕,樹的深度很大饶号,進(jìn)行查找的時(shí)候進(jìn)行磁盤交互次數(shù)太多
查詢數(shù)據(jù)時(shí)候纯趋,先將根節(jié)點(diǎn)的所有數(shù)據(jù)加載到內(nèi)存中俏蛮,然后再內(nèi)存中進(jìn)行比對(duì)(索引桐猬,數(shù)據(jù)是保存再磁盤里面【存在磁盤下, 一般放在數(shù)據(jù)庫安裝的文件的路徑的/data下面溃肪,文件一般是 表名.fm 保存數(shù)據(jù)的結(jié)構(gòu)信息等免胃。 MyISAM數(shù)據(jù)庫引擎的 表名.ymd 保存數(shù)據(jù)庫的數(shù)據(jù) 表名.myi保存數(shù)據(jù)庫的索引,如果是innerDB引擎的話惫撰,一般是 表名.fm 表名.idb】羔沙,加載到內(nèi)存進(jìn)行了一次IO交互),mysql的葉節(jié)點(diǎn)默認(rèn)大小是16kb
innerDB數(shù)據(jù)引擎與myisam引擎的區(qū)別是
innerdb 索引的葉子節(jié)點(diǎn)保存的是數(shù)據(jù)
myisam 索引的葉子節(jié)點(diǎn)保存的是數(shù)據(jù)的磁盤地址
引入概念:聚集索引
聚集索引就是索引的葉子節(jié)點(diǎn)包含了數(shù)據(jù)的所有數(shù)據(jù) 例如innerdb的主鍵索引就是聚集索引厨钻,而myisam的主鍵索引就是非聚集索引扼雏。
索引有兩種結(jié)構(gòu),一種是B+Tree 一種是hash
一般不適用hash是因?yàn)閔ash 不支持范圍查找(主要)夯膀,出現(xiàn)hash碰撞(次要)
二級(jí)索引(非聚集索引)葉子節(jié)點(diǎn)保存的是主鍵诗充,需要回表進(jìn)行查找數(shù)據(jù)
聯(lián)合索引
最左前綴原則的原理就是 例:當(dāng)name不是確定的情況下,age不是有序的诱建。