我很好奇,联合主键顺序有什么不同吗? 例如,两个表的主键之间有什么区别吗?关键顺序在桌面上没有任何区别?
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`)
)
答案 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的顺序存储。这可能对性能有影响,具体取决于您查询数据的方式。