如何在分区时处理外键

时间:2009-10-08 11:28:15

标签: mysql database-design partitioning

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

  1. 日期
  2. 时间
  3. 车辆编号
  4. 纬度
  5. 速度
  6. userid(这是外键......)
  7. 此表将每3秒进行一次写操作。因此,它将有数百万的记录。 所以要检索更快的数据,我计划分区。 现在我的问题是: -

    1. 如何处理外键?我听说分区不支持外键
    2. 应该使用哪一列进行分区。
    3. 是否需要将唯一键作为分区列。
    4. 将有数万亿的记录

      @ rc-感谢man..what abt性能...看到我每隔3秒插入一次数据,所以每次插入数据时都要运行检查程序...那么性能如何? ?

      2>我想把分区栏作为车辆没有.....有没有其他方式......

1 个答案:

答案 0 :(得分:9)

阅读:MySQL Partitioning Limitations

1。)分区表不支持FK。

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

2.。)用于分区的列将取决于您访问表的方式。如果您的查询总是基于vechicle编号,那么在该列上执行散列分区可能是有意义的。如果您正在查询或报告更多关于“本月添加了哪些车辆”的内容,或者您​​希望在分区成为特定年龄时“滚动”分区,那么按日期划分可能是最佳选择。根据您的使用情况,您必须决定这一点。

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

根据用户问题进行修改:

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

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

VehiclesNosLessThan1000

VehiclesNosLessThan2000

... VehiclesNosLessThan

VehiclesNosLessThanMAX

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

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

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