從資料結構角度
1、b+樹索引(o(log(n))):關於b+樹索引,可以參考 mysql索引背後的資料結構及演算法原理
2、hash索引:
a 僅僅能滿足"=","in"和"<=>"查詢,不能使用範圍查詢
b 其檢索效率非常高,索引的檢索可以一次定位,不像b-tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以 hash 索引的查詢效率要遠高於 b-tree 索引
c 只有memory儲存引擎顯示支援hash索引
3、fulltext索引(現在myisam和innodb引擎都支援了)
4、r-tree索引(用於對gis資料型別建立spatial索引)
從物理儲存角度
1、聚集索引(clustered index)
2、非聚集索引(non-clustered index)
從邏輯角度
1、主鍵索引:主鍵索引是一種特殊的唯一索引,不允許有空值
2、普通索引或者單列索引
3、多列索引(復合索引):復合索引指多個欄位上建立的索引,只有在查詢條件中使用了建立索引時的第乙個字段,索引才會被使用。使用復合索引時遵循最左字首集合
4、唯一索引或者非唯一索引
5、空間索引:空間索引是對空間資料型別的字段建立的索引,mysql中的空間資料型別有4種,分別是geometry、point、linestring、polygon。
mysql使用spatial關鍵字進行擴充套件,使得能夠用於建立正規索引型別的語法建立空間索引。建立空間索引的列,必須將其宣告為not null,空間索引只能在儲存引擎為myisam的表中建立
create table table_name[col_name data type]
[unique|fulltext|spatial][index|key][index_name](col_name[length])[asc|desc]
1、unique|fulltext|spatial為可選引數,分別表示唯一索引、全文索引和空間索引;
2、index和key為同義詞,兩者作用相同,用來指定建立索引
3、col_name為需要建立索引的字段列,該列必須從資料表中該定義的多個列中選擇;
4、index_name指定索引的名稱,為可選引數,如果不指定,mysql預設col_name為索引值;
5、length為可選引數,表示索引的長度,只有字串型別的字段才能指定索引長度;
6、asc或desc指定公升序或降序的索引值儲存
首先要明白索引(index)是在儲存引擎(storage engine)層面實現的,而不是server層面。不是所有的儲存引擎都支援所有的索引型別。即使多個儲存引擎支援某一索引型別,它們的實現和行為也可能有所差別。
mysql裡的索引型別主要有以下幾種。
1. b-tree索引
最常見的索引型別,基於b-tree資料結構。b-tree的基本思想是,所有值(被索引的列)都是排過序的,每個葉節點到跟節點距離相等。所以b-tree適合用來查詢某一範圍內的資料,而且可以直接支援資料排序(order by)。但是當索引多列時,列的順序特別重要,需要格外注意。innodb和myisam都支援b-tree索引。innodb用的是乙個變種b+tree,而myisam為了節省空間對索引進行了壓縮,從而犧牲了效能。
2. hash索引
基於hash表。所以這種索引只支援精確查詢,不支援範圍查詢,不支援排序。這意味著範圍查詢或order by都要依賴server層的額外工作。目前只有memory引擎支援顯式的hash索引(但是它的hash是nonunique的,衝突太多時也會影響查詢效能)。memory引擎預設的索引型別即是hash索引,雖然它也支援b-tree索引。
例子:
create
table testhash (
fname varchar(50) not
null,
lname varchar(50) not
null,
keyusing
hash(fname)
) engine =memory;
3. spatial (r-tree)(空間)索引
只有myisam引擎支援,並且支援的不好。可以忽略。
4. full-text索引
主要用來查詢文字中的關鍵字,而不是直接與索引中的值相比較。full-text索引跟其它索引大不相同,它更像是乙個搜尋引擎,而不是簡單的where語句的引數匹配。你可以對某列分別進行full-text索引和b-tree索引,兩者互不衝突。full-text索引配合match against操作使用,而不是一般的where語句加like。
以上內容基本取自high performance mysql一書,對mysql效能調優感興趣的話,此書值得一讀再讀。
mysql索引型別:
索引是一種資料結構,可以是btree,rtree,或者hash結構.
btree適合用於查詢某範圍內的資料,可以很快的從當前資料找到下條資料.
rtree常用於查詢比較接近的資料.
hash結構則適用於隨機訪問的場合,查詢每條資料的時間幾乎相同.
顯然,若要查詢某個時間段的資料,用btree結構要比hash結構快得多.
另外還有fulltext(全文)和spatial(空間)這兩個索引型別.
檢視某個表中存在的索引型別:
use punbb;
select index_name, index_type
from information_schema.statistics
where table_name='pb_posts';
index_name index_type
primary btree
pb_posts_topic_id_idx btree
pb_posts_multi_idx btree
pb_posts_multi_idx btree
pb_posts_posted_idx btree
注:pb_posts是innodb型別表,預設索引為btree.
select index_name, index_type
from information_schema.statistics
where table_name='pb_online'
index_name index_type
pb_online_user_id_ident_idx hash
pb_online_user_id_ident_idx hash
pb_online_ident_idx hash
pb_online_logged_idx hash
注:pb_online是memory型別表,預設索引為hash.
innodb和myisam支援btree和fulltext索引 ,memory支援hash和btree索引.
create table lookup (id int) engine = memory;
create index id_index on lookup (id) using btree;
mysql索引型別介紹 mysql索引型別介紹
索引型別介紹 主鍵索引 primary key 要求關鍵字不能重複,也不能為null,同時增加主鍵約束 主鍵索引定義時,不能命名 唯一索引 unique index 要求關鍵字不能重複,同時增加唯一約束 普通索引 index 對關鍵字沒有要求 全文索引 fulltext key 關鍵字的 不是所有欄...
mysql索引型別介紹 mysql索引型別介紹
b 樹是多路平衡查詢樹,相對於平衡二叉樹,對父結點的直接子結點個數,不再僅限於2,可以指定m 自定義 這樣可以在樹的深度不大量增加的前提下,儲存更多的結點。b 樹是通常在檔案系統中使用。特點 a 樹的每個結點最多有m 自定義 子結點 b 若根結點不是葉子結點,則至少有兩個子結點 c 除根結點外的所有...
MySQL索引 索引型別
在mysql有兩種索引型別 hash b 樹 hash索引原理比較簡單就是利用了乙個hash表 說b 樹之前先要了解b 樹的資料結構。不廢話,先上圖。對b 樹做一些解釋,參考上圖。b 樹的資料都在葉子節點上 非葉子節點上的這些都是範圍。舉例 最上面的根節點上的資料是5,28,65代表的是它的三個子樹...