java学习与总结:索引
生活随笔
收集整理的這篇文章主要介紹了
java学习与总结:索引
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 索引的優(yōu)缺點(diǎn)
- 索引的底層數(shù)據(jù)結(jié)構(gòu)
- 索引類(lèi)型
- 索引存儲(chǔ)結(jié)構(gòu)【不同存儲(chǔ)引擎不同】
- 聯(lián)合索引和覆蓋索引
- 創(chuàng)建索引的注意事項(xiàng)
- 索引失效的情況
索引的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):能加快查找速度。【前提是數(shù)據(jù)量大,否則沒(méi)啥用其實(shí)】
缺點(diǎn):需要維護(hù),犧牲空間。
索引的底層數(shù)據(jù)結(jié)構(gòu)
- hash表【特點(diǎn):無(wú)序】
- 優(yōu)點(diǎn): 單值查找快。
- 缺點(diǎn):哈希沖突,并且不支持范圍查找。
- B+樹(shù)【特點(diǎn):有序】
- 為什么不是平衡樹(shù)、紅黑樹(shù)、B樹(shù),而是B+樹(shù)呢?
- 簡(jiǎn)單來(lái)說(shuō),前面的幾種樹(shù)都有缺點(diǎn)。
- 平衡樹(shù):極限情況會(huì)退化成鏈表,就沒(méi)有意義了。
- 紅黑樹(shù):索引的瓶頸–》io–》平均下來(lái)就是樹(shù)的高度–》紅黑樹(shù)的高度太高相對(duì)B+樹(shù)來(lái)說(shuō)太高。
- B樹(shù):數(shù)據(jù)會(huì)放在非葉子節(jié)點(diǎn),樹(shù)的高度因此也比B+樹(shù)高。
- 為什么不是平衡樹(shù)、紅黑樹(shù)、B樹(shù),而是B+樹(shù)呢?
索引類(lèi)型
- 主鍵索引:唯一,一個(gè)表只允許有一個(gè)主鍵索引,并且不能為空
- 二級(jí)索引
- 唯一索引:唯一,一個(gè)表允許多個(gè)唯一索引,并且允許為空
- 普通索引
- 前綴索引
- 全文索引:檢索大文本數(shù)據(jù)中的關(guān)鍵字的信息
索引存儲(chǔ)結(jié)構(gòu)【不同存儲(chǔ)引擎不同】
-
聚簇索引:innodb
- 特點(diǎn):數(shù)據(jù)和索引存儲(chǔ)在一起
- 優(yōu)點(diǎn):不用回表,查找速度快
- 缺點(diǎn):索引維護(hù)代價(jià)大
-
非聚簇索引: myisam
- 特點(diǎn):數(shù)據(jù)和索引分開(kāi)放
- 優(yōu)點(diǎn):加了主鍵這一層,解耦,所以維護(hù)代價(jià)低
- 缺點(diǎn):多加了一層,所以查找速度慢,需要回表
- 注意:二級(jí)索引都是非聚簇索引
問(wèn)題:非聚簇索引一定會(huì)回表嗎?
- select age from db where age>20
- 覆蓋索引,如果能從索引里找到的,就不用回表了
聯(lián)合索引和覆蓋索引
- 聯(lián)合索引:聯(lián)合索引不是一種類(lèi)型,而是說(shuō)用了多列索引,跟之相互匹配的還有最左匹配原則。
- 最左匹配原則:索引從左到右匹配
- 建立聯(lián)合索引的幾個(gè)原則:
- 最經(jīng)常用的放在左邊【最左匹配原則】;
- 區(qū)分度最高的放在左邊 【最高離散度原則】;
- 寬度小的放在左邊【最小空間原則】
- 覆蓋索引:本質(zhì)是一種特殊的聯(lián)合索引,把select 后需要的列也加入到聯(lián)合索引之中
- 優(yōu)點(diǎn):不用回表
創(chuàng)建索引的注意事項(xiàng)
- 1、選擇合適的字段【where、order by 、join 、select —不為null的字段】
- 2、更新頻繁的最好不要建立索引,維護(hù)成本高
- 3、盡可能考慮建立聯(lián)合索引而不是單列索引,并且盡量考慮覆蓋索引
- 優(yōu)點(diǎn): 空間變小、需要維護(hù)的索引數(shù)量變小
- 4、避免冗余索引—需要維護(hù)
- 5、考慮使用前綴索引代替普通索引
- 6、不能join太多表,join都是通過(guò)嵌套循環(huán)實(shí)現(xiàn)的。匹配次數(shù)、join buffer 緩存
索引失效的情況
- 1、聯(lián)合索引
- a. 聯(lián)合索引不遵循最左匹配原則
- b. 聯(lián)合索引前面索引列使用了范圍查詢(xún)(<,>,like),這里>=不會(huì)失效
- 2、索引上做任何操作
- a. 計(jì)算
- b. 函數(shù)
- c. 隱式轉(zhuǎn)換 最常見(jiàn)的:字符串類(lèi)型不添加引號(hào)
- 3、判空,is null和is not null 都無(wú)法使用索引
- 4、使用or 索引會(huì)失效,能用in盡量用in:age =3 or age =1 ===>盡量換成 age in(3,1)
- 5、鏈表關(guān)聯(lián)使用的字段中的長(zhǎng)度、編碼不一致會(huì)導(dǎo)致失效===》本質(zhì)上是隱式轉(zhuǎn)換
- 6、模糊查詢(xún),以%開(kāi)頭的like會(huì)讓索引失效—》type=all,全表查詢(xún)**。這里可以使用覆蓋索引解決%前置失效的問(wèn)題**
- 7、優(yōu)化器,覺(jué)得如果使用全表掃描比使用索引快,也會(huì)導(dǎo)致索引失效。
總結(jié)
以上是生活随笔為你收集整理的java学习与总结:索引的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java学习与总结:MySQL和数据库基
- 下一篇: 将键值对当作实参传进函数