高性能MySQL之創建高性能的索引
阿新 • • 發佈:2018-10-02
ext 缺點 單獨 意思 無需 數據 lob 哈希 上進
因為哈希索引只存儲對應的哈希值,所以索引的結構十分緊湊;也讓哈希的查找的速度非常快;
索引優點:
拿B-Tree索引來比較,因為數據有序,可以將相關列值都存儲在一起,而且因為索引中存儲了實際的列值,所以某些查詢只需要通過索引就能完成了;
首先我們要認識到索引的各種類型;並在認識的基礎上進行對比;
B-Tree索引;
存儲引擎的不同,會用到不同的技術;
- MyISAM使用前綴壓縮技術使得索引更小;
- InnoDB則按照數據格式進行存儲;
- MyISAM索引通過數據的物理位置引用被索引的行;
- InnoDB根據主鍵引用被索引的行;
對於B-Tree索引的自我總結和概括:
簡單地說呢,就相當於我們的書本目錄一樣了,而InnoDB的索引就是根據主鍵來查找的,因此,當我們建立索引之後,對於查詢的方式,就是現在索引中查找你想要的主鍵,對應好之後,再跳到那一個主鍵對應的數據行,去查詢所有的數據;
伴隨著這種索引,我們就得出了以下幾種適用索引查找的查詢方法;
假定現在的索引有三列,於是我們得出以下的匹配方式;
- 全值匹配:三列要求全部匹配,全值匹配;
- 匹配最左前綴;只匹配最左層的值,只使用索引的第一列
- 匹配列前綴;匹配第一列的一些部分字母;
- 匹配範圍值;範圍匹配;
- 精確匹配某一列並範圍匹配另外一列;從左到右,先精確匹配一列之後再範圍匹配查找,但是記得,範圍查找之後不能再做精確匹配了;
- 只訪問索引的查詢;專門就是只訪問索引的;
但隨之而來的還有B-Tree索引的限制:
- 如果不是從最左前綴開始匹配的話,將無法使用索引;
- 不能跳過索引中間的列,例如,你不能只匹配第一列和第三列;而跳過了第二列,這是不允許的;
- 如果查詢中有某個列的範圍查詢,在這之後的所有列都無法使用索引優化查找,這點在前面有說到了;
哈希索引;
基於哈希表實現,只有精確匹配索引所有列的查詢才有效;對於每一行數據,計算出一個哈希碼,不同鍵值的行計算出來的哈希碼也不一樣,將得出來的哈希碼存入索引中,同時在索引中保存指向每行數據的指針;因為哈希索引只存儲對應的哈希值,所以索引的結構十分緊湊;也讓哈希的查找的速度非常快;
哈希索引的限制:
- 哈希索引裏面只包含哈希值和指針,而不存儲字段值,所以無法通過索引來避免讀取行,意思也就是說,由於索引中不包含行的數據,所以沒有辦法通過只讀取索引來進而讀取整個行數據,不過,訪問內存中的行的速度很快,所以也問題不大;
- 哈希索引不是按照索引值順序存儲的,所以也就無法用於排序了;
- 哈希索引也不支持部分索引列匹配查找,因為你哈希索引畢竟是用索引列的全部內容來計算哈希值的,沒辦法只用部分索引查詢;
- 哈希索引只支持等值查詢,不支持範圍查找;
- 訪問哈希索引的速度非常快,除非有很多哈希沖突;
- 如果哈希沖突很多的話,一些索引維護操作的代價也會很高,因為你如果索引沖突了,就需要遍歷對應哈希值的鏈表中的每一行,直到找到為止;
當我們出現哈希沖突的時候,我們要註意,我們不僅要給出哈希值,還要給出對應的索引內容,這樣方便我們解決哈希沖突,畢竟哈希值相同時,只能通過這樣的方式去區別了;
空間數據索引;
emmmm。。。只剩下MyISAM表支持空間索引了,無需前綴查詢,而是從所有維度來索引數據;全文索引;
一種特殊類型的索引,查找的文本中的關鍵詞;而不是直接比較索引中的值;索引優點:
拿B-Tree索引來比較,因為數據有序,可以將相關列值都存儲在一起,而且因為索引中存儲了實際的列值,所以某些查詢只需要通過索引就能完成了;
三大優點;
- 索引大大減少了服務器需要掃描的數據量;
- 索引可以幫助服務器避免排序和臨時表;
- 索引可以將隨機I/O變為順序I/O;
高性能的索引策略:
- 獨立的列:要求建立索引的列必須是獨立的列;
- 前綴索引和索引選擇性;一般我們都是追求,高選擇性的索引的。什麽是高選擇的索引呢?是指不重復的索引和數據表的記錄總數的比值,在1/n和1之間,值越大,則選擇性越高,唯一索引的選擇性是1,這是最好的索引選擇性,性能也是最好的;對於BLOB,TEXT或者很長的VARCHAR類型的列,我們要求必須使用前綴索引,因為不允許索引這些列的完整長度;
- 多列索引:通過在不同的列上建立不同的列索引,來進行匹配查找;但是事實卻證明,使用多列索引只能說明的你的索引建的很糟糕;
- 選擇合適的索引列順序;正確的順序依賴於使用該索引的查詢,同時考慮如何更好地滿足排序和分組的需要;將選擇性最高的列放在最前面,只能說是一個比較通用方法,但不是最佳的辦法,具體看具體情況的分析;
聚簇索引:
聚簇索引:將索引和對應的數據行都存儲在聚簇索引中,也就是說,並不是一種單獨的索引類型,而是一種數據存儲方式,聚簇索引實際上是保存了B-Tree索引和數據行; 在這裏我們要強調一下的就是B-Tree和聚簇索引的區別: 首先,這兩者是沒法比的,聚簇索引是B-Tree索引的一部分,B-Tree本身是一種索引類型了,就是按照B-Tree數據結構來實現的,而對於B-Tree索引來說,是用哪一個索引並不重要了,可能是主鍵,也可能是全部的數據,但是一定是保存了指向對應數據行的指針的,這是一點,而聚簇索引就是保存了B-Tree索引和對應的數據行,方便了數據的查找; 聚簇索引的優點:- 可以將相關數據保存在一起;
- 數據訪問更快;
- 使用覆蓋索引掃描的查詢可以直接使用主鍵值;
聚簇索引的缺點:
- 最大限度地提高了I/O密集型應用的性能;但是訪問順序沒有那麽重要了,沒有什麽優勢;
- 插入速度嚴重依賴於插入順序;
- 更新聚簇索引列 的代價很高;
- 會面臨頁分裂的的問題;
- 聚簇索引會導致全表掃描變慢;
- 二級索引(非聚簇索引)可能比想象的要更大;
覆蓋索引:
是指索引的葉子節點中已經包含要查詢的數據,如果一個所以包含所有需要查詢的字段的值,就稱為覆蓋索引;直接掃描索引就可以查詢到你想要的值; 因為我們知道這個因為覆蓋索引要求,你在索引中就將要查詢的東西查到了,所以索引必須要存儲索引列的值,因此,哈希索引,空間索引,全文索引都不能用於覆蓋索引;
高性能MySQL之創建高性能的索引