萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql索引類型詳細介紹與用法分析

mysql索引類型詳細介紹與用法分析

索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。

索引是快速搜索的關鍵。MySQL索引的建立對於MySQL的高效運行是很重要的。

1.普通索引

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

CREATE  INDEX  indexName  ON tb_name(col_name(length));

如果類型是varchar、char的length可以小於字段實際長度,如果是BLOB和TEXT類型,必須指定 length,下同。

刪除一個索引

DROM   INDEX   indexName  ON  tb_name;

2. 唯一索引

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


CREATE  UNIQUE  INDEX  indexName  ON tb_name(col_name(length));

它與普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。

3.主鍵索引

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


ID INT NOT NULL,  PRIMARY KEY(ID);

主鍵索引是一種特殊的唯一索引,它不允許列值為空值,且每個表中只能有一個唯一的主鍵

 

4.聯合索引

CREATE  INDEX  indexName  ON tb_name(col1,col2,col3);

聯合索引可以進一步的提高mysql的效率,這樣把col1,col2,col3 建到一個索引裡。如果單獨的在

col1、col2、c0l3上建立單列索引,該表就有3個單列索引,查詢會遠遠低於上述的組合索引,

建立這樣的索引,其實是相當於建立了以下3組索引

1.   col1、col2、c0l3

2.  col1、col2

3.   col1

細心的朋友可能發現沒有 col2、c0l3這樣的組合索引,這是因為mysql索引遵循“最左前綴”的結果。意思就是說只能從最左邊的開始組合。

可以用到組合索引的例子:

SELECT * FROM tb_name WHERE col1=’xxx’ AND col2=’xxx’

SELECT * FROM tb_name WHERE col1=’xxx’

不會用到的

SELECT * FROM tb_name WHERE col2=’xxx’ AND col3=’xxx’

SELECT * FROM tb_name WHERE col2=’xxx’

索引的不足之處

1。雖然加快了對數據的查詢速度,但對降低了insert、update、delete操作的速度,因為它們在更新數據表的同時也要更新索引文件。

2. 如果你的表很大,索引文件也會很大,會降低磁盤空間和I/O操作(該問題不大)

什麼時候使用索引

一般來說,在WHERE和JOIN中出現的列需要建立索引,但也不完全如此,因為MySQL只對<,<=,=,>,>=,BETWEEN,IN,以

及某些時候的LIKE才會使用索引。某些like是指 ‘xxx%’ 而不支持‘%XXX’。

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所允許的最大索引長度是255個字符。


全文索引
文本字段上的普通索引只能加快對出現在字段內容最前面的字符串(也就是字段內容開頭的字符)進行檢索操作。如果字段裡存放的是由幾個、甚至是多個單詞構成 的較大段文字,普通索引就沒什麼作用了。這種檢索往往以LIKE %word%的形式出現,這對MySQL來說很復雜,如果需要處理的數據量很大,響應時間就會很長。
這類場合正是全文索引(full-text index)可以大顯身手的地方。在生成這種類型的索引時,MySQL將把在文本中出現的所有單詞創建為一份清單,查詢操作將根據這份清單去檢索有關的數 據記錄。全文索引即可以隨數據表一同創建,也可以等日後有必要時再使用下面這條命令添加:
ALTER TABLE tablename ADD FULLTEXT(column1, column2)
有了全文索引,就可以用SELECT查詢命令去檢索那些包含著一個或多個給定單詞的數據記錄了。下面是這類查詢命令的基本語法:
SELECT * FROM tablename
WHERE MATCH(column1, column2) AGAINST(‘word1′, ‘word2′, ‘word3′)
上面這條命令將把column1和column2字段裡有word1、word2和word3的數據記錄全部查詢出來。
注解:InnoDB數據表不支持全文索引。

copyright © 萬盛學電腦網 all rights reserved