在MySQL中对复合键进行分区

时间:2017-05-02 12:49:55

标签: mysql database-partitioning

在mysql中我可以拥有一个由自动增量和另一个字段组成的复合主键吗?另外,请批评我的“mysql分区”逻辑

进一步解释 - >

我有一个关于MySQL分区的查询。 我必须在MySQL中对表进行分区,它有一个主键ID。 我必须按日期字段进行分区(非主要,重复条目)。 由于我们无法对重复条目进行分区,因此我创建了一个复合键 - >(id,date)。 如何在此组合键中创建分区?

提前致谢...

1 个答案:

答案 0 :(得分:1)

(这个答案假设是InnoDB,而不是MyISAM。索引的实现存在差异,这使得我的一些评论对MyISAM不正确。)

在MySQL中,表格PRIMARY KEY可以由多个字段组成,包括AUTO_INCREMENT

MySQL AUTO_INCREMENT中唯一的要求是它是某些索引中的第一个列。让我们看一下这个Posts的示例,其中每个用户可以有很多帖子:

PRIMARY KEY(user_id, post_id),
INDEX(post_id)

其中post_idAUTO_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分区的讨论。

结论:你一定不能讨论分区,而不清楚它可能有什么帮助。提供他们;那我们可以进一步讨论。