我正在运行MySQL 5.1并将网络日志中的数据存储到表中。有一个datetime列我想按天分区。每天晚上我都会将前一天的新数据添加到表格中,这就是我想要按天分区的原因。它通常是几百万行。我希望按日分区,因为MySQL查询通常需要20秒才能完成。
简而言之,我希望每天进行分区,因为用户可以点击日历来获取包含一天数据的网络日志信息。数据跨越数百万行(一天)。
我在很多分区文章中看到的问题是你必须明确指定要分区的值?我不喜欢这种方式,因为这意味着我必须每晚更改表格以添加额外的分区。是否有内置的MySQL功能可以自动为我执行此操作,或者我是否必须每晚编写一个bash脚本/ cron作业来为我更改表格?
例如,如果我要遵循以下示例: http://datacharmer.blogspot.com/2008/12/partition-helper-improving-usability.html
在一年内,我会有365个分区。
答案 0 :(得分:3)
索引是任何表的必须。索引的详细信息来自您拥有的SELECTs
;让我们看看他们。
经验法则:
PARTITION BY RANGE()
是唯一有用的分区机制。答案 1 :(得分:2)
我试了一次。我最终创建了一个cron作业来定期进行分区(每月一次)。请记住,每个表最多有1024个分区(http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations.html)。
副手,我可能不会推荐它。根据我的需要,我发现这在需要跨分区结果的任何搜索中都造成了显着的减速。
根据您的更新说明,我首先建议您创建必要的索引。我会阅读MySQL Optimization章节(具体的索引部分),以便更好地了解如何确保您拥有必要的索引。您还可以使用slow_query日志来帮助隔离有问题的查询。
一旦缩小范围,我就会发现您需要将分区更改为希望分区以限制特定分区的大小(可能是存储空间或快速截断等)。此时,您可以决定按月或按年进行分区。
使用日期作为分区键进行分区显然会强制您为日期字段创建索引。从那开始,看看它如何在你按计划进行分区的额外努力之前。