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