mysql 索引

原文鏈接:https://cloud.tencent.com/developer/article/1125452

索引是數據結構

在MySQL中,索引屬於存儲引擎級別的概念,不同存儲引擎對索引的實現方式是不同的。MySQL存儲引擎分爲:InnoDBMyISAM

  • MyISAM引擎使用B+Tree作爲索引結構,葉節點data域存放數據記錄的地址
  • MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。
  • MyISAM中,主索引和輔索引在結構上沒有任何區別,只是主索引要求key是唯一的,而輔索引的key可以重複。
  • MyISAM的索引方式也叫做“非聚簇”的,之所以這麼稱呼是爲了與InnoDB的聚簇索引區分。
  • InnoDB也使用B+Tree作爲索引結構,葉節點包含了完整的數據記錄。這種索引叫做聚簇索引。
  • InnoDB中,表數據文件本身就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。
  • InnoDB的輔索引data域存儲相應記錄主鍵的值而不是地址。

聚簇索引的優點

  1. 聚簇索引將索引和數據行保存在同一個B-Tree中,查詢通過聚簇索引可以直接獲取數據,相比非聚簇索引需要第二次查詢(非覆蓋索引的情況下)效率要高
  2. 聚簇索引對於範圍查詢的效率很高,因爲其數據是按照大小排列的。

聚簇索引的缺點

  1. 聚簇索引的更新代價比較高,如果更新了行的聚簇索引列,就需要將數據移動到相應的位置。這可能因爲要插入的頁已滿而導致“頁分裂”。
  2. 插入速度嚴重依賴於插入順序,按照主鍵進行插入的速度是加載數據到Innodb中的最快方式。如果不是按照主鍵插入,最好在加載完成後使用OPTIMIZE TABLE命令重新組織一下表。
  3. 聚簇索引在插入新行和更新主鍵時,可能導致“頁分裂”問題。
  4. 聚簇索引可能導致全表掃描速度變慢,因爲可能需要加載物理上相隔較遠的頁到內存中(需要耗時的磁盤尋道操作)。

非聚簇索引

非聚簇索引,又叫二級索引。二級索引的葉子節點中保存的不是指向行的物理指針,而是行的主鍵值。當通過二級索引查找行,存儲引擎需要在二級索引中找到相應的葉子節點,獲得行的主鍵值,然後使用主鍵去聚簇索引中查找數據行,這需要兩次B-Tree查找

 

索引使用策略及優化

(1) 定義有主鍵的列一定要建立索引。因爲主鍵可以加速定位到表中的某行

(2) 定義有外鍵的列一定要建立索引。外鍵列通常用於表與表之間的連接,在其上創建索引可以加快表間的連接

(3) 對於經常查詢的數據列最好建立索引。

  • 對於需要在指定範圍內快速或頻繁查詢的數據列,因爲索引已經排序,其指定的範圍是連續的,查詢可以利用索引的排序,加快查詢的時間
  • 經常用在 where子句中的數據列,將索引建立在where子句的集合過程中,對於需要加速或頻繁檢索的數據列,可以讓這些經常參與查詢的數據列按照索引的排序進行查詢,加快查詢的時間。

 

最左前綴原理

  • 最左前綴原則就是先要看第一列,在第一列滿足的條件下再看左邊第二列,以此類推。
  • 在創建多列索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊。
  • 當b+樹的數據項是複合的數據結構,比如(name,age,sex)的時候,b+樹是按照從左到右的順序來建立搜索樹的,比如當(張三,20,F)這樣的數據來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex,最後得到檢索的數據;但當(20,F)這樣的沒有name的數據來的時候,b+樹就不知道下一步該查哪個節點,因爲建立搜索樹的時候name就是第一個比較因子,必須要先根據name來搜索才能知道下一步去哪裏查詢。比如當(張三,F)這樣的數據來檢索時,b+樹可以用name來指定搜索方向,但下一個字段age的缺失,所以只能把名字等於張三的數據都找到,然後再匹配性別是F的數據了, 這個是非常重要的性質,即索引的最左匹配特性。

 

B-Tree 索引的特點

B-tree 索引可以用於使用 =, >, >=, <, <= 或者 BETWEEN 運算符的列比較。如果 LIKE 的參數是一個沒有以通配符起始的常量字符串的話也可以使用這種索引。


Hash 索引的特點
 

Hash 索引只能夠用於使用 = 或者 <=> 運算符的相等比較(但是速度更快),不能夠用於諸如 < 等用於查找一個範圍值的比較運算符。

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章