我有一个MySQL INNODB表,包含大约2000000行和10个字段(表“cars”)。它将以每年50万行的速度递增。它是一个繁忙的表,平均每24/7天每秒查询2-3次不同类型的查询。
现在的情况是,我需要扩展信息以包含一个INT字段(“country_id”)。但是,这个字段至少99%的所有行都是默认的“1”。
我的问题是:是否有任何具体的原因可以采取以下任一解决方案:
将INT字段添加到表中并为其编制索引(“cars”。“country”id)
添加一个关系表(“car_countries”),其中包含字段“car_id”和“country_id”
我在测试环境中设置了这些示例,在查询表中的数据时进行了几千次迭代,以发现:
数据库/表大小将由于索引增加19%(约21 MB)
查询平均要长16%(每个查询1000次,0.37717秒,而0.32431秒)
我以前尝试过为所有字段填充适当的信息,并添加关系表,其中表需要非必需的信息,但现在我读到了,只要不需要在表中排列数据(MySQL不处理(PostgreSQL也处理))。在我的例子中,一辆特定的汽车永远不会销往两个国家,因此永远不需要在一辆特定的汽车上增加更多的国家。
在解决方案1中,几乎所有事情都变得简单,因为磁盘空间并不重要。我还是应该考虑解决方案2吗?如果是,为什么?
谨致问候,
/托马斯

最佳答案

理论上的答案是选项1反映了你的潜在关系——一辆车只能卖给一个国家,因此“多对多”关系(选项2建议)是不合适的。这将使未来的开发人员感到困惑,并污染数据模型。
实用主义的答案是,选项2在今天看来并没有显著的性能提升,而且至关重要的是,它可能会给代码带来复杂性。如果99%的查询不需要国家/地区数据,则必须编写查询以包含该数据(从而否定性能优势),或者构建讨厌的“如果我需要国家/地区,则query=xxx ELSE query=yyy”逻辑。
最后,对于索引问题,MySQL只使用一个查询索引,所以除非您正在编写一个查询,其中“WHERE”在WHERE子句中或被加入,否则不太可能产生影响。

10-07 19:04
查看更多