在mysql中我可以拥有一个由自动增量和另一个字段组成的复合主键吗?另外,请批评我的“mysql分区”逻辑
进一步解释 - >
我有一个关于MySQL分区的查询。 我必须在MySQL中对表进行分区,它有一个主键ID。 我必须按日期字段进行分区(非主要,重复条目)。 由于我们无法对重复条目进行分区,因此我创建了一个复合键 - >(id,date)。 如何在此组合键中创建分区?
提前致谢...
答案 0 :(得分:1)
(这个答案假设是InnoDB,而不是MyISAM。索引的实现存在差异,这使得我的一些评论对MyISAM不正确。)
在MySQL中,表格PRIMARY KEY
可以由多个字段组成,包括AUTO_INCREMENT
。
MySQL AUTO_INCREMENT
中唯一的要求是它是某些索引中的第一个列。让我们看一下这个Posts
的示例,其中每个用户可以有很多帖子:
PRIMARY KEY(user_id, post_id),
INDEX(post_id)
其中post_id
是AUTO_INCREMENT
,但您可以从"群集"中受益user_id
的数据。这种聚类可以提高像
SELECT ... FROM Posts
WHERE user_id = 1234;
回到你的问题......
"分区键"不一定是唯一的;所以,我不能理解你的"不能对重复的条目进行分区"。
INDEX(id, date)
,如果您还有PRIMARY KEY(id)
,则基本上没用。通过id查找,PRIMARY KEY(id)
为您提供了完美的访问权限;将date
添加到索引不会有帮助。在按date
,而不是id
查找时,(id, date)
是无用的,因为只有"左"可以使用复合索引的一部分。
也许您正在使用
指向未分区的表PRIMARY KEY(date, id),
INDEX(id)
使日期范围有效吗? (注意:分区不会有帮助。)
也许你会这样做
SELECT ... WHERE x = 123 AND date BETWEEN ...
在这种情况下,这是有益的:
INDEX(x, date)
只有这样做才能开始讨论分区的效用:
WHERE x BETWEEN ...
AND date BETWEEN ...
这需要一个"二维" index,与SPATIAL
存在哪种。
请参阅my discussion of partitioning,其中我仅列出了4个分区用例。它还链接到关于如何使用2D分区的讨论。
结论:你一定不能讨论分区,而不清楚它可能有什么帮助。提供他们;那我们可以进一步讨论。