【问题标题】:May I benefit from MySQL partitions?我可以从 MySQL 分区中受益吗?
【发布时间】:2015-03-12 10:30:41
【问题描述】:

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

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

  • 超过日期:它不是表中的列,而是外部表中的列。是否可以在分区规则中使用JOINs?
  • 随着时间的推移:我知道我可以使用 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

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

【问题讨论】:

    标签: mysql database-partitioning


    【解决方案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
    

    【讨论】:

    • 这是因为我经常查询仅在特定时间和接下来的 2 小时内有效的行。因此,我创建了包含每天每 3 小时的表,每小时。在上午 10 点 18 分进行搜索时,我想获取到下午 12 点 18 分之前的所有数据,因此我使用了一个 3 小时表:times_10,它涵盖了上午 10 点到下午 1 点。如果我按照您的建议每小时使用一次,那么在 10:18 搜索时,我将无法在上午 11 点之后搜索数据。除非我可以使用相同的语句查询多个分区?我可以吗?
    • 你的意思是你想列出 3 小时的数据?但是假设我在上午 10:10 访问它,那么你想看几个小时?是上午 10 点到下午 1 点还是上午 9 点到下午 12 点?
    • 任何时候,我都想在请求时间+2小时内访问数据。因此,要查询的最小整数小时数为 3(如果您在 8:59 搜索,您希望得到 8-11 而不是 8-10)。
    • 您能否建议用户是否在以下时间访问:- 1. 10:00 =>? 2. 10:30 => ? 3. 10:50 => ? 4. 10:59 => ?在上述情况下,您将显示哪个 3 小时?
    • 对所有人都一样:上午 10 点到下午 1 点,这是保证每次查询至少 2 小时的最短范围。
    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2021-05-28
    • 2011-10-14
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多