联合主键顺序有什么不同吗?

时间:2014-04-03 00:52:18

标签: mysql

我很好奇,联合主键顺序有什么不同吗? 例如,两个表的主键之间有什么区别吗?关键顺序在桌面上没有任何区别?

CREATE TABLE `Q3` (
    `user_id` VARCHAR(20) NOT NULL,
    `retweet_id` VARCHAR(20) NOT NULL,
    PRIMARY KEY (`user_id`,`retweet_id`)
    )

vs

CREATE TABLE `Q3` (
    `user_id` VARCHAR(20) NOT NULL,
    `retweet_id` VARCHAR(20) NOT NULL,
    PRIMARY KEY (`retweet_id`,`user_id`)
    )

2 个答案:

答案 0 :(得分:0)

这会对索引结构产生影响。

在复合索引中,索引值由几个一个接一个的值组成。并且该顺序确定可以使用此特定索引优化哪些查询。

IE:

对于创建为

的索引
PRIMARY KEY (`user_id`,`retweet_id`)

WHERE user_id = 42之类的查询将得到优化(无法保证,但在技术上可行),而对于查询WHERE retweet_id = 4242,它不会被优化。

PS:总是有一个人工主键,如序列(或mysql的自动增量列),而不是使用自然主键,这是一个好主意。这样会更好,因为主键是一个聚簇键,这意味着它定义了如何在磁盘上的页面中物理存储行。这意味着PK单调增长(或减少,无关紧要)是个好主意

答案 1 :(得分:0)

订单确实会影响索引在查询中的使用方式。使用多列时,每列都是前一列的子树。

在你的第一种情况下(user_id,retweet_id) - 如果你在索引中搜索了user_id 1,那么你就拥有了所有的retweet_id。

随后,如果您只想搜索retweet_id = 7(对于所有用户),则无法使用索引,因为您需要先浏览索引中的每个用户项。

因此,如果您希望单独查询user_id或retweet_id(不使用另一个),请先将该列放入。如果您需要两者,可以考虑添加二级索引。

范围扫描也有限制,您只能有效地使用查询范围扫描的最后一列。您可以在此处详细了解所有这些内容: http://dev.mysql.com/doc/refman/5.6/en/multiple-column-indexes.html

此外,如果使用InnoDB,表将按PRIMARY KEY的顺序存储。这可能对性能有影响,具体取决于您查询数据的方式。