2012-05-23 89 views

回答

3

第一指該組合user_id, wallet_type是唯一的,所述第二隻定義visitid是唯一的。

0

第一個被稱爲多列,複合或複合鍵。在這種情況下,主鍵約束是兩列的組合,按列出的順序(user_id,然後是wallet_type)。合併的兩列必須對每一行都是唯一的。

所以,下面的數據是好的:

user_id(pk) wallet_type(pk) 
------------------------- 
1   1 
1   2 
2   2 

注意行可以有重複的user_id的或wallet_type的,但不能同時:

user_id(pk) wallet_type(pk) 
------------------------- 
1   1 
1   2 
2   2 
1   1  // Duplicate key 

第二個例子只是一個普通的單柱鍵,其中visitid列中的正確值必須是唯一的:

visitid(pk) session 
------------------------- 
1    1 
1    2 // Duplicate key 

There對此有很多影響。

多列主鍵較大,因此它使用更多的存儲空間,並且MySQL要遍歷的速度稍慢。

此外,對於InnoDB,由於主鍵是聚簇索引,因此插入會受到負面影響,這意味着它們按物理順序存儲。更大的索引需要更長的時間更新。但是,追加行到最後還是可以的。

有一些好處,例如可以使用多列索引作爲covering索引。

例如,以下查詢將與所述多列主鍵優化:

SELECT user_id, wallet_type FROM table1 WHERE user_id = 1 
SELECT user_id, wallet_type FROM table1 WHERE user_id = 1 AND wallet_type = 2 
SELECT user_id, wallet_type FROM table1 ORDER BY user_id, wallet_type 
SELECT user_id, wallet_type FROM table1 WHERE user_id = 1 ORDER BY wallet_type 
SELECT user_id, wallet_type FROM table1 WHERE user_id > 1 AND wallet_type > 2 
SELECT user_id, wallet_type FROM table1 ORDER BY user_id, wallet_type 

然而,由於列左前綴,這個查詢就不會被優化:

SELECT user_id, wallet_type FROM table1 WHERE wallet_type = 2 

這是因爲user_id未在WHERE子句中引用,但user_id是密鑰中的第一列。你不能跳過一列。