# 數據庫索引常識

MarlonBrando1998 2022-01-08 04:58:55 阅读数:262

索引

數據庫索引常識

  • 業務場景:當錶中有大量的數據但是沒有加任何索引,那麼這時候去查詢這張錶的數據的時候,性能不是特別好,為了提高行能,可以優化查詢Sql,在數據庫層面的話可以做分庫分錶操作,可以做讀寫分離操作。對於單張錶而言,可以適當的增加索引,加快查詢速度。

索引是什麼

​ 舉個例子,你要找到學校中張三的信息那麼最快的方法是,知道張三的班級、宿舍號、學號然後就可以很快的找到張三。類似於圖書館中查找書籍的操作。

​ 索引是對數據庫錶中一個或多個列的值進行排序的結構。

索引類型

哈希錶

HashMap實現原理,哈希錶裏存的是(key-value)鍵值對,根據hash函數計算key的哈希值得到value存放的index。當不同的key擁有相同的hash值的時候,鏈錶方式存儲value的值。哈希錶是無序的,所以做區間查詢比較慢。

數組

​ 數組的長度是固定的,不能高效的實現動態索引的操作,所以適合數據量不變,適用於靜態索引存儲

二叉搜索樹

​ 二叉搜索樹的左子樹的值都小於根節點,右子樹的節點值都大於根節點。單從查詢的角度來說二叉樹是搜索效率最高的,但是實際上大多數的數據庫存儲卻並不使用二叉樹,而是選擇使用多叉樹,也就是B樹、B+樹這種每個節點可以有多個子節點的樹。樹越矮,查詢過程中需要經過的樹節點越少,需要時間也就越少。B+樹優化了二叉搜索樹,增加了寬度,加快查找速度。

Innodb
  • Mysql數據庫的默認存儲引擎
  • 支持事務安裝
  • 灾難性恢複好
  • 使用行級鎖
  • 實現緩沖處理:提供緩存池,緩存索引緩存數據。
  • 支持外鍵

​ 在Innodb中錶中數據都是根據主鍵順序以索引的形式存放。這種存儲方式的錶稱為索引組織錶。每一個索引對應一棵B+樹。

索引實現原理(B樹、Hash等)

B樹
  • m階的B樹,每個節點至多有M棵子樹。
  • 根節點至少有兩棵子樹。
  • 關鍵字分布在整棵樹中,任何一個關鍵字只出現在一個節點中。
  • 搜索性能等價於在關鍵字內做一次二分查找。
B+樹

​ B+樹通常用於數據庫和操作系統的文件系統中,B+樹的特點是能够保持數據穩定有序。

  • 所有關鍵字都在葉子節點的鏈錶中,鏈錶中的關鍵字是有序的。
  • 不可能在非葉子節點找到。
  • 非葉子節點是節點的指針,數據存儲在葉子節點的數據層。

數據庫索引

  • 一個索引構建一棵樹
創建索引優缺點

​ 優點:加快數據檢索速度。

​ 缺點:創建索引和維護索引隨著數據量的增加而增加,每個索引占用一定的物理空間,對錶中的數據進行增加、删除和修改的時候,索引要動態的維護,降低了數據的維護速度。

怎樣創建索引
  • 定義有主鍵或者外鍵的數據列建立索引。
  • 需要在指定範圍內的快速或頻繁查詢的數據列。
  • 經常用在where子句中的數據列。
  • 使用order by、group by、dist 等查詢的列。
  • 查詢中很少涉及的列,重複值較多的列不要建立索引。
  • 對於經常存取的列避免建立索引。
索引匹配原則(最左匹配原則)
  • 例如:有聯合索引(a,b,c)

    索引有效匹配到 (a) (a,b) (a,b,c)

索引失效
  • like查詢 %開頭:索引應該遵循最左匹配原則;
  • 複合索引未用左列字段;
  • 需要類型轉換;
  • where 中索引列有運算;
  • where 中索引使用了函數;
  • 使用 !=或者<>查詢;
  • 列的數據類型不一致;
  • Or查詢引起索引失效;
  • NOT IN、NOT EXISTS 查詢;
  • IS NULL不走索引 IS NOT NULL走索引
版权声明:本文为[MarlonBrando1998]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201080458545397.html