【问题标题】:How to handle foreign key while partitioning分区时如何处理外键
【发布时间】:2009-10-08 11:28:14
【问题描述】:

我正在从事车队管理工作。我在具有以下列的位置表上进行了大量写入

  1. 日期
  2. 时间
  3. 车号
  4. 纬度
  5. 速度
  6. userid(外键...)

这里这个表将每 3 秒进行一次写操作。因此,其中将有数百万条记录。 因此,为了更快地检索数据,我正在计划分区。 现在我的问题:-

  1. 如何处理外键?听说分区不支持外键
  2. 应使用哪一列进行分区。
  3. 是否有必要将唯一键作为分区列。

会有数万亿的记录

@rc-Thanks man.. 性能如何...看到我每 3 秒插入一次数据,所以每次插入数据时我都必须运行检查程序...那么性能呢? ?

2>我想去分区列作为车号.....有没有其他的方法...

【问题讨论】:

    标签: mysql database-design partitioning


    【解决方案1】:

    阅读:MySQL Partitioning Limitations

    1.) 分区表不支持 FK。

    • 一种选择是创建一个存储过程来插入/更新记录,并在过程内部验证传递的用户 ID 在插入发生之前是否存在于您的用户表中。您应该在表上设置权限,以便只允许 SP 更新和插入以允许应用程序和/或用户对检查进行后门。从用户表中删除用户时,您还需要采取预防措施。

    2.) 用于分区的列取决于您访问表的方式。如果您的查询始终基于车辆编号,那么在该列上进行哈希分区可能是有意义的。如果您要查询或报告更多关于“本月添加了哪些车辆”之类的内容,或者您​​想在达到一定年龄时“推出”分区,那么按日期分区可能是要走的路。这是你必须根据你的使用情况来决定的。

    3.) 有关详细信息,请参阅上面的链接。

    根据用户问题进行编辑:

    每 3 秒插入一条记录并不是很大的吞吐量。确保您的用户表上有一个主键,以便有效地完成过程内部的检查。 (即使支持 FK 也是如此)如果您支持 FK,DB 会在幕后为您执行此检查,所以从这个意义上说,它不会伤害您。如果检查最终成为瓶颈,您可能会觉得需要删除它,并可能将错误的用户 ID 报告为夜间批处理,但如果您的用户表相对较小且索引正确,我认为这不是一个问题。

    另一种选择是使用分区表或非分区表手动进行分区(即分片)。当然,对于非分区表,您可以使用本机外键。例如,您可以将您的车辆表拆分为多个表,例如:(假设您想使用 vehicleNo 作为“键”)

    车辆NosLessThan1000

    车辆NosLessThan2000

    VehiclesNosLessThan...

    车辆NosLessThanMAX

    在这里,您可能希望再次拥有一个 SP,以便应用程序/用户不必知道这些表。 SP 将负责根据传入的 vehicleNo 插入/更新正确的表。您还需要一个用于选择数据的 SP,以便应用程序/用户不必知道要从中选择的表。为了轻松访问所有数据,您可以创建一个将所有表联合在一起的视图。

    请注意,这样做的一个好处是当前 MyISAM 在更新期间会锁定整个分区表,而不仅仅是它正在更新的分区。以这种方式对表进行分片可以缓解这种争用,因为表本身就是“分区”。

    根据我对您正在做的事情的有限数据,我可能会编写 2 个存储过程,1 个用于选择数据,1 个用于更新/插入数据,并让您的应用程序使用这些存储过程进行所有访问。然后我会先尝试通过vehicleNo上的哈希进行常规分区,同时在过程中强制执行user_id键。如果这成为问题,您可以轻松迁移到跨多个表分片数据,而无需更改应用程序,因为有关如何检索和更新数据的所有逻辑都包含在 SP 中。

    【讨论】:

    • @rc-Thanks man..what abt the performance ...see I am insearing data after every 3 sec 所以我每次插入数据时都必须运行检查程序...那又如何关于表演??? 2>我想去分区coloum作为车号.....有什么替代方法...
    • 查看我的更新答案。如果您还有其他问题,请告诉我。
    • 小问题:---如何识别车辆不少于1000辆不少于2000辆bcoz这里车号。就像 MH 30 q 1233456.???你建议分片还是分区???
    • 这些只是示例。您只需将算法应用于vehicleNo,它将“路由”到特定的分区/表。如果您的所有 # 都以字母开头,那么一个简单的方法是为 a-g、h-m 等制作表格。这又是一个示例,在您的情况下,这可能不会在表格中均匀分布值。我建议尝试 MySQL 提供的哈希分区,看看它是否适合您的需求。如果您使用 SP 进行选择和更新,它应该允许您在需要时进行更改,而不会影响应用程序。
    • 分区表无法支持引用其他表的外键是相当令人惊讶的。我们知道这是什么基础吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多