>我有一个存储在单个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