1. 程式人生 > 其它 >索引的設計和使用

索引的設計和使用

一、索引的概述

  所有MySQL列型別都可以被索引,對相關列使用索引是提高Select操作效能的最佳途徑。根據儲存引擎可以定義每個表最大索引和最大索引的長度。每種儲存索引(MyISAM、InnDB、BDB、Memory)對每個表至少支援16個索引,總索引長度至少為266位元組。

MyISAM和InnoDB儲存引擎的表預設建立的都是 Btree索引。

Memory儲存引擎的表預設建立的是HASH索引,但也支援Btree索引。

MySQL還不支援函式索引,但支援字首索引,即對索引字元的前N個字元建立索引;

支援索引型別:FULLTEXT,HASH,BTREE,RTREE

FULLTEXT:

全文索引並不是和MyISAM一起誕生的,它的出現是為了解決WHERE name LIKE “%word%"這類針對文字的模糊查詢效率較低的問題。對搜尋引擎稍微有點了解的同學,肯定知道分詞這個概念,FULLTEXT索引也是按照分詞原理建立索引的。

HASH:hash就是一種(key=>value)形式的鍵值對。

由於hash索引可以一次定位,不需要像樹形索引那樣逐層查詢,因此具有極高的效率。

那為什麼還需要其他的樹形索引呢?

(1)Hash 索引僅僅能滿足"=","IN"和"<=>"查詢,不能使用範圍查詢
(2)Hash 索引無法被用來避免資料的排序操作。
(3)Hash 索引不能利用部分索引鍵查詢。
(4)Hash 索引在任何時候都不能避免表掃描。
(5)Hash 索引遇到大量Hash值相等的情況後效能並不一定就會比B-Tree索引高。

BTREE:BTREE索引就是一種將索引值按一定的演算法,存入一個樹形的資料結構中。BTREE在MyISAM裡的形式和Innodb稍有不同。

RTREE:RTREE在mysql很少使用,僅支援geometry資料型別。相對於BTREE,RTREE的優勢在於範圍查詢

各種索引的使用情況

(1)對於BTREE這種Mysql預設的索引型別,具有普遍的適用性

(2)由於FULLTEXT對中文支援不是很好,在沒有外掛的情況下,最好不要使用。其實,一些小的部落格應用,只需要在資料採集時,為其建立關鍵字列表,通過關鍵字索引,也是一個不錯的方法。

(3)對於一些搜尋引擎級別的應用來說,FULLTEXT同樣不是一個好的處理方法,Mysql的全文索引建立的檔案還是比較大的,而且效率不是很高,即便是使用了中文分詞外掛,對中文分詞支援也只是一般。真要碰到這種問題,Apache的Lucene或許是你的選擇。

(4)正是因為hash表在處理較小資料量時具有無可比擬的素的優勢,所以hash索引很適合做快取(記憶體資料庫)。如mysql資料庫的記憶體版本Memsql,使用量很廣泛的快取工具Mencached,NoSql資料庫redis等,都使用了hash索引這種形式。當然,不想學習這些東西的話Mysql的MEMORY引擎也是可以滿足這種需求的。

(5)至於RTREE,很少使用。

二、索引設計的原則

(1)、 最適合做索引的列是出現在where子句中的列或連線子句中指定的列。而不是出現在select選擇列中的列。
(2)、使用唯一索引。考慮某列中值的分佈。索引列的基數越大,索引效果就越好。例如,出生日期的列具有不同的值,很容易區分各行。而用來記錄性別的列,只有M和F,則對此列進行索引沒有多大用處。因為無論搜尋那個值都會得出大約一半的行。
(3)、使用短索引
如果對字串列進行建立索引,應該指定一個字首長度,只要有可能就應該那樣做。例如,有個char(200)列,如果在前10個或20個字元內,多數值是唯一的,那麼就不要對整個列進行索引。對前10個或20個字元進行索引能節省大量的索引空間,也可能會使得查詢更快。較小的索引涉及的磁碟IO操作較小,較短的值比較起來更快。
(4)、利用最左字首。
(5)、不要過度使用索引。
每個額外的索引的都要佔用磁碟空間,並降低寫操作的效能。在修改表的時候索引必須要進行更新,有時候可以還會重構

三、BTREE索引和HASH索引

Memory儲存引擎的表可以選擇使用Btree索引或者Hash索引,兩種不同型別的索引各有不同的適用範圍。Hash索引有重要特徵需要注意:
1.只用於使用=或<= >= 操作符的等式比較。
2.優化器不能使用Hash索引來加速Order By操作;
3.MySQL不能確定在兩個值之間大約有多少行;
4.只能使用整個關鍵字來搜尋一行

下列範圍查詢適用於Btree索引和Hash索引

select * from t1 where key_col =1 or key_col2 in (15,18,20);

下列範圍查詢只適用於BTree索引

select * from t1 where key_col > 1 and key_col <10;
select * from t1 where key_col like 'ab%' or key_col between 'lisa' and 'simon';

總結:固定值搜尋用Hash,範圍值或者like 用BTree

四、小結

索引用於快速找出在某個列中有一特定值的行。如果不使用索引,MySQL必須從第1條記錄開始然後讀完整張表直達找出相關的行,即全表掃描。記錄行越大,花費的時間就越多。

大多數MySQL索引在BTree中儲存。只是空間列型別的索引使用RTree。