我可以从MySQL分区中受益吗?

时间:2015-03-12 10:30:42

标签: mysql database-partitioning

我有一个存储在单个SSD上的数据库。我认为这足以告诉我我不需要分区,但仍然,我想完全验证这一点。

我的大表(我们称之为times)有一个代表一天中某个时间的列,存储为一个哑整数。例如,'12:07:31'存储为120731

这个表中有一个外键到另一个(我们称之为trips);这与最后一个(称为calendar)相关联,后者包含日期信息。

目前我有一个每晚运行的脚本:

  • 过滤calendar表以仅检索今天的行
  • 从中选择times仅与今天匹配的所有信息
  • 从中创建一个每小时+3
  • 的表格

按'每小时+3',我的意思是我有这些表:

  • times_00 =>从早上12点到凌晨3点
  • times_01 =>从凌晨1点到凌晨4点
  • times_02 =>从凌晨2点到凌晨5点
  • ...
  • times_19 =>从晚上7点到晚上10点
  • ...

因此,当我想查询times时,我只是在上午10点到11点之间查询times_10;或times_17下午5点至下午6点等。
这要快得多,因为我从10M变为<200k行。

现在我觉得我可以从分区中受益,但是如何分区:

  • 超过日期:它不是表的列,而是外表中的列。是否可以在分区规则中使用JOIN
  • 随着时间的推移:我知道我可以使用RANGE进行分区,但这不会让我重叠分区:0-3,1-4,2-5 ...

有可能吗?值得吗?


您需要find here all the data来重现我的设置。

以下是./test.sh的输出:

stop_times:

real    0m0.487s
user    0m0.004s
sys     0m0.000s
stop_times_part:

real    0m0.707s
user    0m0.000s
sys     0m0.004s
stop_times_14:

real    0m0.127s
user    0m0.004s
sys     0m0.000s

结果是可变的,但我观察到前两种方法的时间相似(大约500ms),最后一种方法的时间快了4倍(大约125ms)

1 个答案:

答案 0 :(得分:1)

据我了解,您希望将“时间”表行分区为不同的表。这样您的查询就会变得很快。但我不明白你为什么要创建'每小时+3'表而不是'每小时'表。如果你生成每个小时表,那么我认为你没有重叠的问题,每一行时间表将是'每小时'表的外键。

例如

every_hour_12_03_2015_01 => for 12AM to 1 AM
every_hour_12_03_2015_02 => for 1AM to  2 AM
every_hour_12_03_2015_03 => for 2AM to  3 AM

:
:

every_hour_12_03_2015_24 => for 11PM to 12 AM