1

这两个指标有什么区别?我指的是“PRIMARY”下的两列和其他方式之间的区别..

在此处输入图像描述

在此处输入图像描述

4

2 回答 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 回答