MySQL推荐,字段与关系表

时间:2013-10-14 12:19:21

标签: php mysql sql

我有一个MySQL INNODB表,其中包含大约2,000,000行,包含10个字段(表“cars”)。它将以每年约50万行的当前速度逐步增加。这是一个繁忙的表格,平均每秒24次,每次查询不同类型的查询2-3次。

现在的情况是我需要扩展信息以包含INT字段(“country_id”)。但是,此字段将至少99%的所有行都默认为“1”。

我的问题是:是否有任何具体原因可以执行以下任一解决方案:

  1. 将INT字段添加到表中并将其编入索引(“cars”。“country_id”)
  2. 添加一个包含字段“car_id”和“country_id”的关系表(“car_countries”)
  3. 我在测试环境中设置了这些示例,进行了几千次迭代,查询表中的数据以找出它:

    1. 数据库/表格大小将由于索引增加19%(~21 MB)
    2. 查询的平均时间将延长16%(0.37717秒,而每次1000次查询则为0.32431秒)
    3. 我之前曾尝试为所有字段保留填充适当信息的表格,并添加了关系表,其中表格需要非强制性信息,但现在我已经读过,只要没有必要在表中有数组(MySQL不处理(和PostgreSQL))。在我的例子中,特定的汽车永远不会出售给2个国家,所以永远不需要为特定的汽车增加更多的国家。

      使用解决方案1几乎所有内容都更容易,因为磁盘空间并不重要。 我还应该考虑解决方案2吗?如果是这样,为什么?

      致以最诚挚的问候,

      /托马斯

2 个答案:

答案 0 :(得分:1)

理论上的答案是选项1反映了您的潜在关系 - 汽车只能出售给一个国家,因此“多对多”关系(选项2建议)是不合适的。它会使未来的开发人员感到困惑,并污染数据模型。

实用的答案是,选项2今天似乎没有显着的性能提升,而且 - 至关重要的是 - 它可能会给代码带来复杂性。如果99%的查询不需要国家/地区数据,您必须编写查询以包含它(从而否定性能优势),或构建令人讨厌的“如果我需要国家那么查询= xxx ELSE查询= yyy”逻辑。

最后,提出索引问题 - MySQL只为查询使用一个索引,因此,除非您正在编写一个查询,其中“country”位于where子句中或正在连接,否则不太可能产生影响。

答案 1 :(得分:0)

感谢bwoebi,RaphaëlAlthaus,AgRizzo,Alfons和Ed Gibbs对这个问题的投入!

简短摘要:

  • 由于车上不能有两个国家,只需要一个额外的场地:
    • 使用解决方案1 ​​
  • 此外,可能不需要索引,请检查我们在特定情况下的基数和效果

/托马斯