1. 程式人生 > >關於mysql索引的認識--複合索引

關於mysql索引的認識--複合索引


1、普通索引

 

  普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件(WHEREcolumn=)或排序條件(ORDERBYcolumn)中的資料列建立索引。只要有可能,就應該選擇一個數據最整齊、最緊湊的資料列(如一個整數型別的資料列)來建立索引。

 

  2、唯一索引

 

  普通索引允許被索引的資料列包含重複的值。比如說,因為人有可能同名,所以同一個姓名在同一個“員工個人資料”資料表裡可能出現兩次或更多次。

 

  如果能確定某個資料列將只包含彼此各不相同的值,在為這個資料列建立索引的時候就應該用關鍵字UNIQUE把它定義為一個唯一索引。這麼做的好處:一是簡化了MySQL對這個索引的管理工作,這個索引也因此而變得更有效率;二是MySQL會在有新記錄插入資料表時,自動檢查新記錄的這個欄位的值是否已經在某個記錄的這個欄位裡出現過了;如果是,MySQL將拒絕插入那條新記錄。也就是說,唯一索引可以保證資料記錄的唯一性。事實上,在許多場合,人們建立唯一索引的目的往往不是為了提高訪問速度,而只是為了避免資料出現重複。

 

  3、主索引

 

  在前面已經反覆多次強調過:必須為主鍵欄位建立一個索引,這個索引就是所謂的“主索引”。主索引與唯一索引的唯一區別是:前者在定義時使用的關鍵字是PRIMARY而不是UNIQUE。

 

  4、外來鍵索引

 

  如果為某個外來鍵欄位定義了一個外來鍵約束條件,MySQL就會定義一個內部索引來幫助自己以最有效率的方式去管理和使用外來鍵約束條件。

 

  5、複合索引

 

  索引可以覆蓋多個數據列,如像INDEX(columnA,columnB)索引。這種索引的特點是MySQL可以有選擇地使用一個這樣的索引。如果查詢操作只需要用到columnA資料列上的一個索引,就可以使用複合索引INDEX(columnA,columnB)。不過,這種用法僅適用於在複合索引中排列在前的資料列組合。比如說,INDEX(A,B,C)可以當做A或(A,B)的索引來使用,但不能當做B、C或(B,C)的索引來使用。

 

  6、索引的長度

 

  在為CHAR和VARCHAR型別的資料列定義索引時,可以把索引的長度限制為一個給定的字元個數(這個數字必須小於這個欄位所允許的最大字元個數)。這麼做的好處是可以生成一個尺寸比較小、檢索速度卻比較快的索引檔案。在絕大多數應用裡,資料庫中的字串資料大都以各種各樣的名字為主,把索引的長度設定為10~15個字元已經足以把搜尋範圍縮小到很少的幾條資料記錄了。在為BLOB和TEXT型別的資料列建立索引時,必須對索引的長度做出限制;MySQL所允許的最大索引全文索引文字欄位上的普通索引只能加快對出現在欄位內容最前面的字串(也就是欄位內容開頭的字元)進行檢索操作。如果欄位裡存放的是由幾個、甚至是多個單詞構成的較大段文字,普通索引就沒什麼作用了。這種檢索往往以的形式出現,這對MySQL來說很複雜,如果需要處理的資料量很大,響應時間就會很長。

 

  這類場合正是全文索引(full-textindex)可以大顯身手的地方。在生成這種型別的索引時,MySQL將把在文字中出現的所有單詞建立為一份清單,查詢操作將根據這份清單去檢索有關的資料記錄。全文索引即可以隨資料表一同建立,也可以等日後有必要時再使用下面這條命令新增:

 

  ALTERTABLEtablenameADDFULLTEXT(column1,column2)有了全文索引,就可以用SELECT查詢命令去檢索那些包含著一個或多個給定單詞的資料記錄了。下面是這類查詢命令的基本語法:

 

  SELECT*FROMtablename

 

  WHEREMATCH(column1,column2)AGAINST(‘word1','word2','word3’)

 

  上面這條命令將把column1和column2欄位裡有word1、word2和word3的資料記錄全部查詢出來。


 

附個實踐(20萬條資料):

mysql-uroot -p123456

 

usevlcmarket

selectcount(*) from vlc_caiji_detail_1;

select* from vlc_caiji_detail_1 where cid=934 and days=3;

0.09sec

 

select* from vlc_caiji_detail_1 where cid=5 and days=8;

0.08sec

 

 

索引:

select* from vlc_caiji_detail_1 where cid=934 and days=3;

0.03

select* from vlc_caiji_detail_1 where cid=5 and days=8;

0.02

 

 

select* from vlc_caiji_detail_1 where cid=734 and days=7;

0.01

select* from vlc_caiji_detail_1 where cid=30 and days=1;

0.01

 

 

複合索引

CREATEINDEX cid_days ON vlc_caiji_detail_1(cid, days);

 

select* from vlc_caiji_detail_1 where cid=934 and days=3;

0.00sec

 

select* from vlc_caiji_detail_1 where cid=5 and days=8;

0.00sec


本文轉載:點選開啟連結


一、為什麼要建立索引呢(優點)?
這是因為,建立索引可以大大提高系統的效能。
第一,   通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。
第二,   可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。
第三,   可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。
第四,   在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五,   通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。

二、建立方向索引的不利因素(缺點)
也許會有人要問:增加索引有如此多的優點,為什麼不對錶中的每一個列建立一個索引呢?這種想法固然有其合理性,然而也有其片面性。雖然,索引有許多優點,但是,為表中的每一個列都增加索引,是非常不明智的。這是因為,增加索引也有許多不利的一個方面。

第一,   建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。
第二,   索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
第三,   當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。 


複合索引:

就是一個索引建立在兩個列 或者多個列上。在搜尋時,當兩個或者多個列作為一個關鍵值時,最好在這些列上建立複合索引。當建立複合索引時,應該考慮這些規則:最多可以把16個列合併 成一個單獨的複合索引,構成複合索引的列的總長度不能超過900位元組,也就是說複合列的長度不能太長;在複合索引中,所有的列必須來自同一個表中,不能跨 表建立複合列;在複合索引中,列的排列順序是非常重要的,因此要認真排列列的順序,原則上,應該首先定義最唯一的列,例如在(COL1,COL2)上的索 引與在(COL2,COL1)上的索引是不相同的,因為兩個索引的列的順序不同;為了使查詢優化器使用複合索引,查詢語句中的WHERE子句必須參考複合 索引中第一個列;當表中有多個關鍵列時,複合索引是非常有用的;使用複合索引可以提高查詢效能,減少在一個表中所建立的索引數量。