建立索引的原則:
- 定義主鍵的數(shù)據(jù)列一定要建立索引茬暇。
- 定義有外鍵的數(shù)據(jù)列一定要建立索引。
- 對于經(jīng)常查詢的數(shù)據(jù)列最好建立索引。
- 對于需要在指定范圍內(nèi)的快速或頻繁查詢的數(shù)據(jù)列;
- 經(jīng)常用在WHERE子句中的數(shù)據(jù)列。
- 經(jīng)常出現(xiàn)在關(guān)鍵字order by、group by呻引、distinct后面的字段,建立索引吐咳。如果建立的是復(fù)合索引逻悠,索引的字段順序要和這些關(guān)鍵字后面的字段順序一致元践,否則索引不會被使用。
- 對于那些查詢中很少涉及的列童谒,重復(fù)值比較多的列不要建立索引单旁。
- 對于定義為text、image和bit的數(shù)據(jù)類型的列不要建立索引饥伊。
- 對于經(jīng)常存取的列避免建立索引
- 限制表上的索引數(shù)目象浑。對一個存在大量更新操作的表,所建索引的數(shù)目一般不要超過3個琅豆,最多不要超過5個愉豺。索引雖說提高了訪問速度,但太多索引會影響數(shù)據(jù)的更新操作茫因。
- 對復(fù)合索引蚪拦,按照字段在查詢條件中出現(xiàn)的頻度建立索引。在復(fù)合索引中冻押,記錄首先按照第一個字段排序驰贷。對于在第一個字段上取值相同的記錄,系統(tǒng)再按照第二個字段的取值排序洛巢,以此類推饱苟。因此只有復(fù)合索引的第一個字段出現(xiàn)在查詢條件中,該索引才可能被使用,因此將應(yīng)用頻度高的字段狼渊,放置在復(fù)合索引的前面,會使系統(tǒng)最大可能地使用此索引类垦,發(fā)揮索引的作用狈邑。
組合多個索引
一個單獨的索引掃描只能用于這樣的條件子句:使用被索引字段和索引操作符類中的操作符, 并且這些條件以AND連接蚤认。假設(shè)在(a, b)上有一個索引米苹, 那么類似WHERE a = 5 AND b = 6的條件可以使用索引,但是像WHERE a = 5 OR b = 6的條件就不能直接使用索引砰琢。
一個類似WHERE x =42 OR x = 47 OR x = 53 OR x = 99 這樣的查詢可以分解成四個在x上的獨立掃描蘸嘶,每個掃描使用一個條件, 最后將這些掃描的結(jié)果OR 在一起陪汽,生成最終結(jié)果训唱。另外一個例子是,如果我們在x 和y上有獨立的索引挚冤,一個類似WHERE x = 5 AND y = 6 這樣的查詢可以分解為幾個使用獨立索引的子句况增,然后把這幾個結(jié)果AND 在一起,生成最終結(jié)果训挡。
在大多數(shù)最簡單的應(yīng)用里澳骤,可能有多種索引組合都是有用的歧强,數(shù)據(jù)庫開發(fā)人員必須在使用哪個索引之間作出平衡。有時候多字段索引是最好的为肮,有時候創(chuàng)建一個獨立索引并依靠索引組合是最好的摊册。比如,假如你的查詢有時候只涉及字段x颊艳,有時候只涉及字段y茅特,有時候兩個字段都涉及, 那么你可能會選擇在x和y上創(chuàng)建兩個獨立的索引籽暇, 然后依靠索引組合來處理同時使用兩個字段的查詢温治。你也可以在(x, y)上創(chuàng)建一個多字段索引, 它在同時使用兩個字段的查詢通常比索引組合更高效戒悠,但是對那些只包含y的查詢幾乎沒有用熬荆,因此它不能是唯一一個索引。一個多字段索引和y上的獨立索引可能會更好绸狐。因為對那些只涉及x的查詢卤恳, 可以使用多字段索引,但是它會更大寒矿,因此也比只在x上的索引更慢突琳。最后一個選擇是創(chuàng)建三個索引, 但是這種方法只有在表的更新遠比查詢少符相,并且所有三種查詢都很普遍的情況下才是合理的拆融。如果其中一種查詢比其它的很多,那么你可能更愿意僅僅創(chuàng)建兩種匹配更常見查詢的索引啊终。