php - MySQL推荐,字段vs关系表

标签 php mysql sql

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

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

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

  1. 将 INT 字段添加到表中并对其进行索引 ("cars"."country_id")
  2. 添加一个包含字段“car_id”和“country_id”的关系表(“car_countries”)

我在测试环境中设置了这些示例,进行了几千次查询表数据的迭代以找出这一点:

  1. 数据库/表大小将因索引增加 19%(~21 MB)
  2. 查询平均需要 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/

相关文章:

php - 无法使用 NodeMCU 向服务器发送 POST 请求

php - 如何找到一组中三个连续值的总和等于某个值的频率?

php - cakephp 3.x 同时在两个表中插入数据

java - 如何使用 Hibernate 进行查询并对对象字段应用限制

PHP - 如何计算插入数据库的行数

Mysql 计算多列

javascript - 将 PHP 数据传递给 Ajax 响应?

MySQL选择重构

javascript - 使用javascript中的onclick获取输入标签中每个值的值

php - 如何排除三个不同表的查询结果?