多对多 - 数据库表:最佳性能实践

时间:2016-03-18 11:07:37

标签: mysql sql database database-design

我对我的MYSQL数据库设计的性能有疑问。

表A有很多记录,比如一百万,而表B也有一百万。还有另一个表C,其中A的每个记录ID连接到B中的每一行,并且此连接具有附加值1或0.因此从功能上讲,A中的每个记录都有一个布尔向量,其中B包含'变量'矢量和1或0是值。它在底部的图像中以图形方式进行了解释。

表C将有大量的写入和读取操作(从A的记录中选择所有值),因此该表非常活跃。表C真的很长,一百万行一百万次。

  • 我的第一个问题是,表格的长度是否会有效 问题?数据库需要非常快。
  • 我的第二个问题是,如果设计得很糟糕,是否有更好的设计来实现我想要的。例如,我可以考虑将每个A记录的整个B向量存储在A中的每一行内。然后,表C将不是必需的。但它会使选择,阅读,写作变得更加困难。

table

2 个答案:

答案 0 :(得分:2)

表设计很好,不应该是一个问题,因为您通过ID来访问记录,这些ID应该被索引。根据您的典型查询,您还应考虑添加复合索引(c(a_id,b_id)c(a_id,value)c(b_id,value)c(a_id,b_id,value))。

但是,由于只存在两种状态,0和1,因此您可以决定仅存储其中一种状态。即如果仅存储所有状态1记录,则表中不包含状态0的所有对都是隐式的。特别是当状态分布不均时(例如,90%的记录具有状态0且只有10%具有状态1)或者您通常只访问其中一个状态(例如,您总是寻找1个),这会付出代价。

答案 1 :(得分:1)

  1. 回答您的第一个问题
  2.   

    具有多个读写的表中的数百万条记录将不是a   如果你遵循mysql的最佳实践,那就是瓶颈。

         

    你的引擎应该是innodb。

         

    您的选择查询不应涉及全表扫描。

         

    你的桌子应该有所需的索引。

    1. 回答第二个问题
    2.   

      您应该查找所有可能的用例,因为无论哪种方式   如果用例支持它,这是一个好主意。

           

      如果您跨多个表拆分数据而不是连接操作   如果需要,可以进行。