聚簇索引:數(shù)據(jù)和文件放在一起:
InnoDB
.frm
:存放的是表結(jié)構(gòu)四敞,
.ibd
:存放的是數(shù)據(jù)文件和索引文件巢墅。非聚簇索引:數(shù)據(jù)和索引單獨(dú)一個(gè)文件:
MyISAM
.frm
:存放的是表結(jié)構(gòu)尼摹,
.MYI
:存放索引數(shù)據(jù)
.MYD
:存放實(shí)際數(shù)據(jù)索引結(jié)構(gòu):
B+Tree是在BTree的基礎(chǔ)之上做的一種優(yōu)化拇泛,變化如下:
1、B+Tree每個(gè)節(jié)點(diǎn)可以包含更多的節(jié)點(diǎn),這個(gè)做的原因有兩個(gè),第一個(gè)原因是為了降低樹的高度,第二個(gè)原因是將數(shù)據(jù)范圍變?yōu)槎鄠€(gè)區(qū)間幽污,區(qū)間越多,數(shù)據(jù)檢索越快
2簿姨、非葉子節(jié)點(diǎn)存儲(chǔ)key距误,葉子節(jié)點(diǎn)存儲(chǔ)key和數(shù)據(jù)
3簸搞、葉子節(jié)點(diǎn)兩兩指針相互連接(符合磁盤的預(yù)讀特性),順序查詢性能更高
- InnoDB是通過B+Tree結(jié)構(gòu)對(duì)主鍵創(chuàng)建索引准潭,然后葉子節(jié)點(diǎn)中存儲(chǔ)記錄趁俊,如果沒有主鍵,那么會(huì)選擇唯一鍵刑然,如果沒有唯一鍵寺擂,那么會(huì)生成一個(gè)6位的row_id來作為主鍵
- MyISAM葉節(jié)點(diǎn)存的是地址,根據(jù)地址去數(shù)據(jù)文件里找到對(duì)應(yīng)記錄泼掠。
- 如果創(chuàng)建索引的鍵是其他字段怔软,那么在葉子節(jié)點(diǎn)中存儲(chǔ)的是該記錄的主鍵,然后再通過主鍵索引找到對(duì)應(yīng)的記錄,叫做回表
1.主鍵一般設(shè)為自增择镇,新增數(shù)據(jù)都會(huì)在索引文件末尾添加爽雄,利于索引維護(hù),若不是自增沐鼠,在中間插入會(huì)導(dǎo)致索引頁的頁分裂和合并,增加開銷叹谁。
2.覆蓋索引饲梭,select id from tbl_t where name = 'mm'
,這里對(duì)name列建立了索引,id是主鍵焰檩,這樣的話就可以通過一次name的索引拿到id了憔涉,不用再去id的索引樹里找,不需要用到回表析苫。
3.組合索引兜叨,(最左匹配原則)
比如有張表,有id衩侥,name国旷,age,address茫死, 我們?cè)趎ame跪但,age創(chuàng)建了組合索引,則當(dāng)
select * from tbl where name=' ' and age=' ';
select * from tbl where name=' ' ;
上面會(huì)用到索引峦萎。
但是直接
select * from tbl where age=' '屡久;
這樣不會(huì)用到索引。
4.索引下推爱榔,select * from tbl where name=' ' and age = 10;
這里原先name
建有索引被环,本來要用回表,先根據(jù)name
索引找到->對(duì)應(yīng)id
详幽,再去id
索引去篩選age=10
.
現(xiàn)在可以用索引下推筛欢,提前查找name
的時(shí)候篩選age
,在回表之前做了數(shù)據(jù)篩選,提高執(zhí)行效率