2

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

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

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

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

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

4

2 回答 2

8

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

经验法则:

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

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

顺便说一句,我可能不会推荐它。出于我的需要,我发现这在任何需要跨分区结果的搜索中造成了显着的放缓。

根据您更新的解释,我首先建议创建必要的索引。我会阅读MySQL 优化章节(特别是关于索引的部分),以更好地了解如何确保您拥有必要的索引。您还可以使用 slow_query 日志来帮助隔离有问题的查询。

缩小范围后,我可以看到您需要将分区更改为想要分区以限制特定分区的大小(可能是为了存储空间或快速截断等)。此时,您可以决定按月或按年进行分区。

使用日期作为分区键进行分区显然会迫使您为日期字段创建索引。在您开始按计划进行分区的额外工作之前,先看看它是如何进行的。

于 2012-08-30T15:34:27.877 回答