这两个指标有什么区别?我指的是“PRIMARY”下的两列和其他方式之间的区别..
问问题
62 次
2 回答
3
第一个表示该组合user_id, wallet_type
是唯一的,第二个仅定义visitid
为唯一的。
于 2012-05-23T11:15:59.250 回答
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 列中的 just 值必须是唯一的:
visitid(pk) session
-------------------------
1 1
1 2 // Duplicate key
这有很多含义。
多列主键更大,所以它使用更多的存储空间,MySQL 遍历的速度稍慢。
此外,对于 InnoDB,插入会受到负面影响,因为主键是聚集索引,这意味着它们是按物理顺序存储的。较大的索引需要更长的时间来更新。但是,将行附加到末尾是可以的。
有一些好处,例如可以使用多列索引作为覆盖索引。
例如,以下查询将使用多列主键进行优化:
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
这是因为在 WHERE 子句中没有引用 user_id,但 user_id 是键中的第一列。您不能跳过一列。
于 2012-05-23T13:10:31.980 回答