2012-05-23 56 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是密钥中的第一列。你不能跳过一列。