索引用于快速找出在某個列中有一特定值的行。不使用索引,mysql必須從第1條記錄開始然后讀完整個表直到找出相關(guān)的行,還需要考慮每次讀入數(shù)據(jù)頁的IO開銷。而如果采取索引,則可以根據(jù)索引執(zhí)行的頁以及記錄在頁中的位置,迅速地讀取目標(biāo)頁進(jìn)而獲取目標(biāo)記錄。
大多數(shù)情況下都(默認(rèn))采用B樹來構(gòu)建索引。只是空間列類型的索引使用R-樹,并且MEMORY表還支持hash索引。B樹是平衡多叉樹,每個節(jié)點存放多少個值取決于值所占的空間,這與每一張數(shù)據(jù)頁存放多少條記錄與記錄信息量有關(guān)同理。節(jié)點中的值是以非降序進(jìn)行排列的,節(jié)點中的值總是小于等于指向它的節(jié)點中的值。
MySQL使用B樹構(gòu)造索引的情況下,是由葉子指向具體的頁和記錄的。并且一個葉子有一個指針指向下一個葉子。
使用索引需要注意:
- 只對WHERE和ORDER BY需要查詢的字段設(shè)置索引,避免無意義的硬盤開銷;
- 組合索引支持前綴索引;
- 更新表的時候,如增刪記錄,mysql會自動更新索引,保持樹的平衡;因此更多的索引意味著更多的維護(hù)成本。
索引的字段類型問題
- text類型,也可建索引(需指定長度);
- myisam存儲引擎索引鍵長度綜合不能超過1000字節(jié)
- 用來篩選的值盡量保持和索引列同樣的數(shù)據(jù)類型
索引分四類
- index --- 普通的索引,數(shù)據(jù)可以重復(fù)
- fulltext --- 全文索引,用來對大表的文本域(char,varchar,text)進(jìn)行索引。語法和普通索引一樣
- unique --- 唯一索引,要求所有記錄都唯一
- primary key --- 主鍵索引,也就是在唯一索引的基礎(chǔ)上相應(yīng)的列必須為主鍵