天天看點

Mysql中的索引(聯合索引)

首先對于索引相關的東西,這篇部落格還是挺全的:

https://www.cnblogs.com/sweet521/p/6203360.html

對于表的單列(如id)資料,是可以建立索引的,對于多列(id和name組合,或者,name和id組合),也可以建立索引。

聯合索引,也稱之為組合索引。

索引作用

在索引列上,除了上面提到的有序查找之外,資料庫利用各種各樣的快速定位技術,能夠大大提高查詢效率。特别是當資料量非常大,查詢涉及多個表時,使用索引往往能使查詢速度加快成千上萬倍。

建立聯合索引的文法

在執行CREATE TABLE語句時可以建立索引,也可以單獨用CREATE INDEX或ALTER TABLE來為表增加索引。

create index indexName on  tableName(column1,column2,...,columnN),如create idx_un_userid_username on user(id,name)
           
CREATE TABLE E (e1 INT, e2 VARCHAR(9), e3 INT, PRIMARY KEY(e1, e3)); 
這樣就建立了一個聯合索引:e1,e3
           

聯合索引可以建立多列(列數大于2)的索引,建議列數最多不要越過3列,超過3列,應重新設計表。

觸發索引的條件:

1.使用聯合索引的全部索引鍵,可觸發索引的使用。

例如:SELECT E.* FROM E WHERE E.e1=1 AND E.e3=2

2、使用聯合索引的字首部分索引鍵,如“key_part_1 常量”,可觸發索引的使用。

例如:SELECT E.* FROM E WHERE E.e1=1

3、使用部分索引鍵,但不是聯合索引的字首部分,如“key_part_2 常量”,不可觸發索引的使用。

例如:SELECT E.* FROM E WHERE E.e3=1

4、使用聯合索引的全部索引鍵,但索引鍵不是AND操作,不可觸發索引的使用。

例如:SELECT E.* FROM E WHERE E.e3=2 OR E.e1=1

聯合索引的好處

A:避免回表

在執行計劃中,table access by index rowid代表是回表動作。

如在user的id列建有索引,select id from user這個不用回表,直接從索引中讀取id的值,而select id,name from user中,不能傳回除id列其他的值,是以必須要回表。

如果建有了id和name列的聯合索引,則可以避免回表。

另外,建立了id和name的聯合索引(id列在在前),則select id from user可以避免回表,而不用單獨建立id列的單列索引。

B:兩個單列查詢傳回行較多,同時查傳回行較少,聯合索引更高效。

還有一種情況是 當有一列有重複資料的時候,可以通過第二個索引進行查詢判斷,找到最終的目标行。

如果select * from user where id=2 和select * from user where name=‘tom’ 各自傳回的行數比較多,而select * from user where id=2 and name='tom’傳回的行數比較少,那麼這個時候使用聯合索引更加高效。

聯合索引使用結論:

1):查詢條件中出現聯合索引第一列,或者全部,則能利用聯合索引.

2):條件列中隻要條件相連在一起,以本文例子來說就是:

last_name=’1′ and first_name=’1′

first_name=’1′ and last_name=’1′,無論前後,都會利用上聯合索引.

3):查詢條件中沒有出現聯合索引的第一列,而出現聯合索引的第二列,或者第三列,都不會利用聯合索引查詢.

使用聯合索引需要注意的地方

A:超過3個列的聯合索引不合适,否則雖然減少了回表動作,但索引塊過多,查詢時就要周遊更多的索引塊了;

B:建索引動作應謹慎,因為建索引的過程會産生鎖,不是行級鎖,而是鎖住整個表,任何該表的DML操作都将被阻止,在生産環境中的繁忙時段建索引是一件非常危險的事情;

C:對于某段時間内,海量資料表有頻繁的更新,這時可以先删除索引,插入資料,再重建立立索引來達到高效的目的。

單一列索引的應用結論:

1):隻要條件列中出現索引列,無論在什麼位置,都能利用索引查詢.

兩者的共同點:

1):要想利用索引,都要符合SARG标準.

  1. :都是為了提高查詢速度.

3):都需要額外的系統開銷,磁盤空間.

補充說明: stmtText資訊來産生,在查詢語句前面加上:SET STATISTICS PROFILE on.可以通過運作它,來觀察你的查詢是否合理,這樣才能真正做到優化.

索引:建立索引可以根據查詢業務的不同分為兩種:單一列的索引,聯合索引.

顧名思義,單一列索引就是指在表的某一列上建立索引,聯合索引是在多個列上聯合建立索引.

優缺點比較:

1):索引所占用空間:單一列索引相對要小.

2):索引建立時間:單一列索引相對短.

3):索引對insert,update,delete的影響程式:單一列索引要相對低.

4):在多條件查詢時,聯合索引效率要高.

索引的使用範圍

單一列索引可以出現在where 條件中的任何位置,而聯合索引需要按一定的順序來寫.

轉自:https://blog.csdn.net/xsf1840/article/details/75201131