gpt4 book ai didi

mysql - 分区时如何处理外键

转载 作者:行者123 更新时间:2023-12-01 08:41:52 24 4
gpt4 key购买 nike

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

  • 日期
  • 时间
  • 车辆编号
  • 纬度
  • 速度
  • 用户 ID(这是外键...)

  • 这里这个表将每 3 秒进行一次写操作。因此,其中将有数百万条记录。
    所以为了检索更快的数据,我正在规划分区。
    现在我的问题:-
  • 如何处理外键?听说分区不支持外键
  • 应该使用哪一列进行分区。
  • 是否有必要将唯一键作为分区列。

  • 将有万亿记录

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

    2>我想去分区列作为车辆没有.....有什么替代方法...

    最佳答案

    阅读:MySQL Partitioning Limitations

    1.) 分区表不支持 FK。

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

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

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

    根据用户问题进行编辑:

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

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

    车辆NosLessThan1000

    车辆NosLessThan2000

    车辆NosLessThan...

    车辆NosLessThanMAX

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

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

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

    关于mysql - 分区时如何处理外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1537219/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com