1. 程式人生 > >索引的型別及分類

索引的型別及分類

一、索引型別
Mysql目前主要有以下幾種索引型別:FULLTEXT,HASH,BTREE,RTREE。

1. FULLTEXT
即為全文索引,目前只有MyISAM引擎支援。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前只有 CHAR、VARCHAR ,TEXT 列上可以建立全文索引。

全文索引並不是和MyISAM一起誕生的,它的出現是為了解決WHERE name LIKE “%word%"這類針對文字的模糊查詢效率較低的問題。

2. HASH
由於HASH的唯一(幾乎100%的唯一)及類似鍵值對的形式,很適合作為索引。

HASH索引可以一次定位,不需要像樹形索引那樣逐層查詢,因此具有極高的效率。但是,這種高效是有條件的,即只在“=”和“in”條件下高效,對於範圍查詢、排序及組合索引仍然效率不高。

3. BTREE
BTREE索引就是一種將索引值按一定的演算法,存入一個樹形的資料結構中(二叉樹),每次查詢都是從樹的入口root開始,依次遍歷node,獲取leaf。這是MySQL裡預設和最常用的索引型別。

4. RTREE
RTREE在MySQL很少使用,僅支援geometry資料型別,支援該型別的儲存引擎只有MyISAM、BDb、InnoDb、NDb、Archive幾種。

相對於BTREE,RTREE的優勢在於範圍查詢。

ps. 此段詳細內容見此片博文:Mysql幾種索引型別的區別及適用情況

二、索引種類
普通索引:僅加速查詢

唯一索引:加速查詢 + 列值唯一(可以有null)

主鍵索引:加速查詢 + 列值唯一(不可以有null)+ 表中只有一個

組合索引:多列值組成一個索引,專門用於組合搜尋,其效率大於索引合併

全文索引:對文字的內容進行分詞,進行搜尋

ps.索引合併,使用多個單列索引組合搜尋

覆蓋索引,select的資料列只用從索引中就能夠取得,不必讀取資料行,換句話說查詢列要被所建的索引覆蓋

三、使用索引的注意事項

使用索引時,有以下一些技巧和注意事項:

1.索引不會包含有NULL值的列

只要列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。所以我們在資料庫設計時不要讓欄位的預設值為NULL。

2.使用短索引

對串列進行索引,如果可能應該指定一個字首長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字元內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和I/O操作。

3.索引列排序

MySQL查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此資料庫預設排序可以符合要求的情況下不要使用排序操作;儘量不要包含多個列的排序,如果需要最好給這些列建立複合索引。

4.like語句操作

一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引。

5.不要在列上進行運算

複製程式碼 程式碼如下:
select * from users where YEAR(adddate)<2007;

將在每個行上進行運算,這將導致索引失效而進行全表掃描,因此我們可以改成:

複製程式碼 程式碼如下: select * from users where adddate<‘2007-01-01';

6.不使用NOT IN和<>操作