如何按日分区MySQL表?

时间:2012-08-30 15:26:45

标签: mysql database

我正在运行MySQL 5.1并将网络日志中的数据存储到表中。有一个datetime列我想按天分区。每天晚上我都会将前一天的新数据添加到表格中,这就是我想要按天分区的原因。它通常是几百万行。我希望按日分区,因为MySQL查询通常需要20秒才能完成。

简而言之,我希望每天进行分区,因为用户可以点击日历来获取包含一天数据的网络日志信息。数据跨越数百万行(一天)。

我在很多分区文章中看到的问题是你必须明确指定要分区的值?我不喜欢这种方式,因为这意味着我必须每晚更改表格以添加额外的分区。是否有内置的MySQL功能可以自动为我执行此操作,或者我是否必须每晚编写一个bash脚本/ cron作业来为我更改表格?

例如,如果我要遵循以下示例: http://datacharmer.blogspot.com/2008/12/partition-helper-improving-usability.html

在一年内,我会有365个分区。

2 个答案:

答案 0 :(得分:3)

索引是任何表的必须。索引的详细信息来自您拥有的SELECTs;让我们看看他们。

经验法则:

  • 不要对少于一百万行的表进行分区
  • 不要使用超过50个分区。
  • 如果您在几天/几周/几个月后“清除旧数据”,请参阅my blog以获取有关如何执行此操作的代码。
  • PARTITION BY RANGE()是唯一有用的分区机制。

答案 1 :(得分:2)

我试了一次。我最终创建了一个cron作业来定期进行分区(每月一次)。请记住,每个表最多有1024个分区(http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations.html)。

副手,我可能不会推荐它。根据我的需要,我发现这在需要跨分区结果的任何搜索中都造成了显着的减速。

根据您的更新说明,我首先建议您创建必要的索引。我会阅读MySQL Optimization章节(具体的索引部分),以便更好地了解如何确保您拥有必要的索引。您还可以使用slow_query日志来帮助隔离有问题的查询。

一旦缩小范围,我就会发现您需要将分区更改为希望分区以限制特定分区的大小(可能是存储空间或快速截断等)。此时,您可以决定按月或按年进行分区。

使用日期作为分区键进行分区显然会强制您为日期字段创建索引。从那开始,看看它如何在你按计划进行分区的额外努力之前。