1. 程式人生 > >複合主鍵與聯合主鍵、索引與聯合(複合)索引

複合主鍵與聯合主鍵、索引與聯合(複合)索引

前幾天面試時被問到了MySql中聯合索引使用與生效問題;回來順便看了一下複合主鍵與聯合主鍵,查漏補缺,慢慢學習吧。

一、複合主鍵與聯合主鍵

1、複合主鍵:指表的主鍵含有一個以上的欄位組成,不使用無業務含義的自增id作為主鍵。

create table test

(

   name varchar(19),

   id number,

   value varchar(10),

   primary key (name,id)

)

上面的name和id欄位組合起來就是test表的複合主鍵 ,它的出現是因為name欄位可能會出現重名,所以要加上id欄位,這樣就可以保證記錄的唯一性 ,一般情況下,主鍵的欄位長度和欄位數目越少越好 。 

“當表中只有一個主鍵時,它是唯一的索引;當表中有多個主鍵時,稱為複合主鍵,複合主鍵聯合保證唯一索引” 。

某幾個主鍵欄位值出現重複是沒有問題的,只要不是有多條記錄的所有主鍵值完全一樣,就不算重複。

2、聯合主鍵顧名思義就是多個主鍵聯合形成一個主鍵組合。 

聯合主鍵的意義:用2個欄位(或者多個欄位)來確定一條記錄。說明:這2個欄位可以都不唯一,即2個欄位可以分別重複,這麼設定的好處,可以很直觀的看到某個重複欄位的記錄條數。 

舉例: 主鍵A跟主鍵B組成聯合主鍵 

主鍵A跟主鍵B的資料可以完全相同,聯合就在於主鍵A跟主鍵B形成的聯合主鍵是唯一的。 

下例主鍵A資料是1,主鍵B資料也是1,聯合主鍵其實是11,11是唯一值,不允許再出現11這個值(即為多對多關係)

主鍵A資料   主鍵B資料 

   1      1 

   2      2 

   3      3 

主鍵A與主鍵B的聯合主鍵值最多為: 11、 12、 13、 21、 22、 23、 31、 32、 33。

二、索引、聯合(組合)索引

1.索引是加快查詢速度的有效手段。系統在存取資料時會自動選擇合適的索引作為存取路徑。

建立索引:create [unique] [cluster] index <索引名>

刪除索引:drop index <索引名>

索引是各種關係資料庫系統最常見的一種邏輯單元,是關係資料庫系統舉足輕重的重要組成部分,對於提高檢索資料速度有著至關重要的作用,索引的原理是根據索引值得到行指標,然後快速定位到資料庫記錄。

索引的使用

1). 主鍵(預設是自帶索引的)和外來鍵(以及一些可以跟其他表關聯的欄位) 

2). where子句中經常出現的欄位 

3). 索引應該建在小欄位上,大資料欄位(bit,image,text,blob等)不適用

2.聯合(複合)索引------ 最左匹配原則

建立聯合索引:create index <索引名稱> on 表名 (欄位1,欄位2...);

例如:有聯合索引(a,b,c,d)

select * from test where a=1 and b=2;----a和b索引都起作用

索引生效原則:按照聯合索引的順序,從前往後依次使用生效,如果中間某個索引沒有使用,那麼斷點前面的索引部分起作用,斷點後面的索引沒有起作用

例如:where a=1 and b=2 and d=4;則只有a和b索引起作用,中間c斷了,則d索引不起作用。

mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配。

比如where a = 1 and b = 2 and c > 3 and d = 4 ,如果建立(a,b,c,d)順序的索引,d是用不到索引的,因為c出現了“>”。

如果建立(a,b,d,c)的索引則where a = 1 and b = 2 and c > 3 and d = 4 中abcd都可以用到索引,並且a,b,d的順序可以任意調整,即:select * from test where b=2 and d=4 and a=1and c>3中a,b,c,d也都用到了索引。

注意:

1)只要列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。所以我們在資料庫設計時不要讓欄位的預設值為NULL。

2)一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引。

3)NOT IN和操作都不會使用索引將進行全表掃描。NOT IN可以NOT EXISTS代替。

補充:

可以在Navicat中建立一張表,並建立一個聯合(複合)索引,在表中插入一些資料,之後利用Explain SELECT * FROM 表名 where 索引欄位名1= value1 and 索引欄位名2=value2 and 索引欄位名3>value3;類似的語句來進行分析和查詢聯合索引。