存儲(chǔ)引擎InnoDB
索引是一種數(shù)據(jù)結(jié)構(gòu)(本質(zhì)是對(duì)數(shù)據(jù)排序),能提高我們的查詢速度:運(yùn)用 局部性原理
索引采用的數(shù)據(jù)結(jié)構(gòu):Hash索引(key-value)和B+樹索引(多路平衡查詢樹)
Hash索引(key-value)和B+樹索引區(qū)別:
- 哈希索引只適用于等值查詢的場(chǎng)景哟绊,但無(wú)法進(jìn)行范圍查詢
- 哈希索引無(wú)法利用索引進(jìn)行排序
- 哈希索引不支持多列聯(lián)合索引的最左匹配原則
- 如果有大量重復(fù)鍵值得情況下萝招,哈希索引的效率很低由桌,因?yàn)榇嬖诠E鲎?/li>
聚簇索引(葉子節(jié)點(diǎn)存儲(chǔ) 整行數(shù)據(jù))與非聚簇索引(主鍵值)
覆蓋索引:一個(gè)查詢語(yǔ)句只需要從索引取得,不必從數(shù)據(jù)表中讀取
因?yàn)镮nnoDB的數(shù)據(jù)文件本身要按主鍵聚集套么,所以InnoDB要求表必須有主鍵(MyISAM可以沒有)
如果沒有顯式指定最蕾,則MySQL系統(tǒng)會(huì)自動(dòng)選擇一個(gè)可以唯一標(biāo)識(shí)數(shù)據(jù)記錄的列作為主鍵
如果不存在這種列,則MySQL自動(dòng)為InnoDB表生成一個(gè)隱含字段作為主鍵
索引的最左匹配特性
葉子節(jié)點(diǎn)存儲(chǔ)真實(shí)數(shù)據(jù)(索引字段要盡量小源内,降低樹的高度)
輔助索引:data域記錄主鍵的值葡粒,而不是地址
輔助索引搜索:
1.檢索輔助索引獲得主鍵,
2.利用主鍵膜钓,到主索引中檢索獲得記錄
在使用InnoDB存儲(chǔ)引擎時(shí)嗽交,如果沒有特別的需要,請(qǐng)永遠(yuǎn)使用一個(gè)與業(yè)務(wù)無(wú)關(guān)的自增字段作為主鍵
Mysql5.6對(duì)對(duì)索引引入了哪些優(yōu)化:
索引下推技術(shù)(有了索引下推可以在有l(wèi)ike的情況下呻此,減少回表次數(shù))
查詢優(yōu)化器(explain select轮纫。。焚鲜。 )
在一條單表查詢語(yǔ)句真正執(zhí)行之前掌唾,MySQL的查詢優(yōu)化器會(huì)找出執(zhí)行該語(yǔ)句所有可能使用的方案,對(duì)比之后找出成本最低的方案忿磅。
優(yōu)化過(guò)程大致如下:
1糯彬、根據(jù)搜索條件,找出所有可能使用的索引
2葱她、計(jì)算全表掃描的代價(jià)
3撩扒、計(jì)算使用不同索引執(zhí)行查詢的代價(jià)
4、對(duì)比各種執(zhí)行方案的代價(jià)吨些,找出成本最低的那一個(gè)