生活随笔
收集整理的這篇文章主要介紹了
                                
MySQL索引知识点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
 
                                
                            
                            
                            MySQL索引知識點
 
 
目錄
 
B+ Tree 原理MySQL 索引索引優化索引的優點索引的使用條件 
 
1. B+ Tree 原理
 
1. 數據結構
 
B+ Tree 指的是 Balance Tree,也就是平衡樹。平衡樹是一顆查找樹,并且所有的葉子結點位于同一層。B+ Tree 是基于 B Tree 和葉子節點順序訪問指針進行實現,它具有 B Tree 的平衡性,并且通過順序訪問指針來提高區間查詢的性能。在 B+ Tree 中,一個節點中的 key 從左到右非遞減排列,如果某個指針的左右相鄰 key 分別是 key(i) 和 key(i+1),那么該指針指向節點的所有 key 大于等于 key(i) 且小于等于 key(i+1)。
  
 
2. 操作
 
進行查找操作時,首先在根節點進行二分查詢,找到一個 key 所在的指針,然后遞歸地在指針所指向的節點進行查找。直到查找到葉子節點,然后再葉子節點上進行二分查找,找出 key 所對應的 data。插入刪除操作會破壞平衡樹的平衡性,因此在插入刪除操作之后,需要對樹進行一個分裂、合并、旋轉等操作來維護平衡性。 
 
3. 與紅黑樹的比較
 
紅黑樹等平衡樹也可以用來實現索引,但是文件系統及數據庫系統普遍采用 B+ Tree 作為索引結構,主要有以下兩個原因:
 
(一)更少的查找次數
 
平衡樹查找操作的時間復雜度和樹高 h 相關,O(h) = O(logdN),其中 d 為每個節點的出度。紅黑樹的出度為 2,而 B+ Tree 的出度一般都非常大,所以紅黑樹的樹高 h 很明顯比 B+ Tree大非常多,查找的次數也就更多 
(二)利用磁盤預讀特性
 
為了減少磁盤 I/O 操作,磁盤往往不是嚴格按需讀取,而是每次都會預讀。預讀過程中,磁盤進行順序讀取,順序讀取不需要進行磁盤尋道,并且只需要很短的磁盤旋轉時間,速度會非常快。操作系統一般將內存和磁盤分割成固定大小的塊,每一塊稱一頁,內存與磁盤以頁為單位交換數據。數據庫系統將索引的一個節點的大小設置為頁的大小,使得一次 I/O 就能完全載入一個節點。并且可以利用預讀特性,相鄰的節點也能夠預先載入。 
 
2. MySQL 索引
 
索引是存儲引擎層實現的,而不是在服務器層實現的,所以不同存儲引擎具有不同的索引類型和實現。
 
1. B+ Tree 索引
 
是大多數 MySQL 存儲引擎的默認索引類型。因為不再需要進行全表掃描,只需要對樹進行搜索即可,所以查找速度快很多。因為 B+ Tree 的有序性,所以除了用戶查找,還可以用于排序和分組。可以指定多個列作為索引列,多個索引列共同組成鍵。適用于全健值、健值范圍和鍵前綴查找,其中鍵前綴查找只適用于最左前綴查找。如果不是按照索引列的順序查找,則無法使用索引。InnoDB 的 B+ Tree 索引分成主索引和輔助索引。主索引的葉子節點 data 域記錄著完整的數據記錄,這種索引方法被稱為聚簇索引。因為無法把數據行存放在兩個不同的地方,所以一個表只能有一個聚簇索引。B+樹索引并不能找到一個給定健值的具體行。B+數索引能找到的只是被查找數據行所在的頁。然后數據庫通過把頁讀入內存,再在內存中進行查找,最后得到查找的數據。
 輔助索引的葉子節點的 data 域記錄著主鍵的值,因此在使用輔助索引進行查找時,需要先查找到主鍵值,然后再到主索引中進行查找。
 
 
  
 
2. 哈希索引
 
哈希索引能以 O(1) 時間進行查找,但是失去了有序性:
 
- 無法用于排序與分組
- 只支持精確查找,無法用于部分查找和范圍查找。
InnoDB 存儲引擎有一個特殊的功能叫“自適應哈希索引”,當某個索引值被引用的非常頻繁時,會在 B+ Tree 索引之上再創建一個哈希索引,這樣就讓 B+ Tree 索引具有哈希索引的一些優點,比如快速的哈希查找。
 
 
3. 全文索引
 
MyISAM 存儲引擎支持全文索引,用于查找文本中的關鍵字,而不是直接比較是否相等。查找條件使用 MATCH AGAINST,而不是普通的 WHERE。全文索引使用倒排索引實現,它記錄著關鍵字到其所在文檔的映射。InnoDB 存儲引擎在 MySQL 5.6.4 版本總也開始支持全文索引。 
 
4. 空間數據索引
 
MyISAM 存儲引擎支持空間數據索引(R-Tree),可以用于地理數據存儲。空間數據索引會從所有維度來索引數據,可以有效地使用任意維度來進行組合查找。必須使用 GIS 相關的函數來維護數據。 
 
3. 索引優化
 
1. 獨立的列
 
在進行查找時,索引列不能是表達式的一部分,也不能是函數的參數,否則無法使用索引。
 例如下面的查詢不能使用 actor_id 列的索引。
 
 
 
2. 多列索引
 
在需要使用多個索引作為條件進行查詢時,使用到列所有比使用單個所有的性能更好。例如下面的語句中,最好把 actor_id 和 film_id 設置為多列索引。
 
 
 
3. 索引列的順序
 
讓選擇性最強的索引放在前面。
 
索引的選擇性是指:不重復的索引值和記錄總數的比值。最大為1,此時每個記錄都有唯一的索引與其對應。選擇性越高,每個記錄的區別度越高,查詢效率也越高。
 
例如下面顯示的結果中 customer_id 的選擇性比 staff_id 更高,因此最好把 customer_id 列放在多列索引的前面。
 
 
 
4. 前綴索引
 
對于 BLOB、TEXT 和 VARCHAR 類型的列,必須使用前綴索引,只索引開始的部分字符。
 
前綴長度的選取需要根據索引選擇性來確定。
 
 
5. 覆蓋索引
 
索引包含所有需要查詢的字段的值。
 
具有以下優點:
 
- 索引通常遠小于數據行的大小,只讀索引能大大減少數據訪問量。
- 一些存儲引擎(例如 MyISAM)在內存中只緩存索引,而數據依賴于操作系統來緩存,而數據依賴于操作系統來緩存。因此,只訪問索引可以不使用系統調用(通常比較費時)
- 對應 InnoDB 引擎,若輔助索引能夠覆蓋查詢,則無需訪問主索引。
 
4. 索引的優點
 
- 大大減少了服務器需要掃描的數據行數
- 幫助服務器避免進行排序和分組,以及避免創建臨時表(B+ Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。臨時表主要是在排序和分組過程中創建,不需要排序和分組,也就不需要創建臨時表)
- 將隨機 I/0 變為順序 I/O(B+ Tree索引是有序的,會將相鄰的數據都存儲在一起)
 
5. 索引的使用條件
 
- 對于非常小的表,大部分情況下簡單的全表掃描比建立索引更高效;
- 對于中到大型的表,索引就非常有效;
- 但是對于特大型的表,建立和維護索引的代價將會隨之增長。這種情況下,需要用到一種技術可以直接區分需要查詢的一組數據,而不是一條記錄一條記錄的匹配。例如可以使用分區技術。
總結
                            
                                以上是生活随笔為你收集整理的MySQL索引知识点的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。