索引的類型及分類

作者:CodingPanda

出處:CodingPanda – 博客園

一、索引方法

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和<>操作

赞(0)