我有一个 MySQL INNODB 表,其中包含大约 2,000,000 行和 10 个字段(表“cars”)。它将继续以每年约 500,000 行的当前速度逐步增加。这是一个繁忙的表,平均每秒 2-3 次 24/7 收到不同类型的查询。
现在的情况是我需要扩展信息以包含一个 INT 字段(“country_id”)。但是,对于至少 99% 的所有行,此字段将默认为“1”。
我的问题是:执行以下任一解决方案是否有任何特定原因:
- 将 INT 字段添加到表中并对其进行索引 ("cars"."country_id")
- 添加一个包含字段“car_id”和“country_id”的关系表(“car_countries”)
我在测试环境中设置了这些示例,进行了几千次查询表数据的迭代以找出这一点:
- 数据库/表大小将因索引增加 19%(~21 MB)
- 查询平均需要 16% 的时间(0.37717 秒对 0.32431 秒,每个 1000 个查询)
我以前曾尝试让表中的所有字段都填充适当的信息,并在表需要非强制性信息的情况下添加了关系表,但现在我读到只要没有必要这样做就没有什么好处在表中排列数据(MySQL 不处理(而 PostgreSQL 处理))。在我的例子中,一辆特定的汽车永远不会卖给 2 个国家,所以永远不需要为一辆特定的汽车添加更多的国家。
使用解决方案 1 几乎一切都变得更容易,因为磁盘空间并不重要。 无论如何我还应该考虑解决方案 2 吗?如果是,为什么?
最好的问候,
/托马斯
最佳答案
理论上的答案是选项 1 反射(reflect)了您的潜在关系 - 一辆汽车只能卖给一个国家,因此“多对多”关系(选项 2 所暗示的)是不合适的。它会让 future 的开发人员感到困惑,并污染数据模型。
务实的答案是,选项 2 目前似乎没有显着的性能改进,而且 - 至关重要的是 - 它可能会给您的代码带来复杂性。如果 99% 的查询不需要国家/地区数据,您要么必须编写包含它的查询(从而抵消性能优势),要么构建讨厌的“如果我需要国家/地区则查询 = xxx ELSE 查询 = yyy”逻辑.
最后,关于索引问题 - MySQL 只使用一个索引进行查询,因此除非您编写的查询中“国家/地区”位于 where 子句中或被连接,否则它不太可能产生影响。
关于php - MySQL推荐,字段vs关系表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19360119/