首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在分区时处理外键

如何在分区时处理外键
EN

Stack Overflow用户
提问于 2009-10-08 11:28:14
回答 1查看 10.3K关注 0票数 3

我在做舰队管理工作。我在具有以下列的location表上有大量的写操作

  1. 日期
  2. 时间
  3. 车号。
  4. 纬度
  5. 速度
  6. 用户is (这是外键.)

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

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

将会有数万亿的记录

@rc-谢谢man..what,我每隔3秒插入一次数据,所以每次插入data...so时都要运行一个检查过程,那么性能呢?

2>I想用分区列作为车辆no.....is的任何替代方式.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-10-08 11:43:40

读:MySQL分区限制

1.)分区表不支持FKs。

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

2.)用于分区的列将取决于访问表的方式。如果您的查询总是基于vechicle .,那么在该列上执行散列分区可能是有意义的。如果您正在查询或报告更多类似“本月添加了哪些车辆”之类的内容,或者希望在某一年龄时将分区“滚动”出去,那么按日期分区可能是可行的方法。这是你必须根据你的使用来决定的事情。

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

基于用户问题的编辑:

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

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

VehiclesNosLessThan1000

VehiclesNosLessThan2000

VehiclesNosLessThan...

VehiclesNosLessThanMAX

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

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

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1537219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档