我可以从MySQL分区中受益



>我有一个存储在单个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;或者在下午5点到6点之间查询times_17,等等。
这要快得多,因为我从 10M 行增加到 <200k 行。

现在我有一种感觉,我可以从分区中受益,但是如何分区:

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

可能吗?值得吗?


您将在这里找到重现我的设置所需的所有数据。

这是./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

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

我了解,您想将"时间"表行划分为不同的表。以便您的查询变得快速。但我不明白为什么要创建"每小时+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

相关内容

  • 没有找到相关文章

最新更新