我有一个MySQL INNODB表,其中包含大约2,000,000行,包含10个字段(表“cars”)。它将以每年约50万行的当前速度逐步增加。这是一个繁忙的表格,平均每秒24次,每次查询不同类型的查询2-3次。
现在的情况是我需要扩展信息以包含INT字段(“country_id”)。但是,此字段将至少99%的所有行都默认为“1”。
我的问题是:是否有任何具体原因可以执行以下任一解决方案:
我在测试环境中设置了这些示例,进行了几千次迭代,查询表中的数据以找出它:
我之前曾尝试为所有字段保留填充适当信息的表格,并添加了关系表,其中表格需要非强制性信息,但现在我已经读过,只要没有必要在表中有数组(MySQL不处理(和PostgreSQL))。在我的例子中,特定的汽车永远不会出售给2个国家,所以永远不需要为特定的汽车增加更多的国家。
使用解决方案1几乎所有内容都更容易,因为磁盘空间并不重要。 我还应该考虑解决方案2吗?如果是这样,为什么?
致以最诚挚的问候,
/托马斯
答案 0 :(得分:1)
理论上的答案是选项1反映了您的潜在关系 - 汽车只能出售给一个国家,因此“多对多”关系(选项2建议)是不合适的。它会使未来的开发人员感到困惑,并污染数据模型。
实用的答案是,选项2今天似乎没有显着的性能提升,而且 - 至关重要的是 - 它可能会给代码带来复杂性。如果99%的查询不需要国家/地区数据,您必须编写查询以包含它(从而否定性能优势),或构建令人讨厌的“如果我需要国家那么查询= xxx ELSE查询= yyy”逻辑。
最后,提出索引问题 - MySQL只为查询使用一个索引,因此,除非您正在编写一个查询,其中“country”位于where子句中或正在连接,否则不太可能产生影响。
答案 1 :(得分:0)
感谢bwoebi,RaphaëlAlthaus,AgRizzo,Alfons和Ed Gibbs对这个问题的投入!
简短摘要:
/托马斯