mysql - 深度连接性能

标签 mysql performance join

我有三个名为 userscitiescountries 的表,这两个场景:

1)用户属于城市,城市属于国家(深度连接)

  • 表 users 有 2 个字段:id (PK) 和 city_id (FK)。
  • 表城市有 2 个字段:id (PK) 和country_id (FK)。
  • 表国家/地区有 2 个字段:ID (PK) 和名称。

获取任何用户的国家/地区:

SELECT country.name
FROM users
LEFT JOIN cities ON user.city_id = cities.id
LEFT JOIN countries ON city.country_id = country.id
WHERE user.id = 1;

2)用户属于城市和国家,城市属于国家(一次加入)

  • 表 users 有 3 个字段:id (PK)、city_id (FK) 和country_id (FK)。
  • 表城市有 2 个字段:id (PK) 和country_id (FK)。
  • 表国家/地区有 2 个字段:ID (PK) 和名称。

获取任何用户的国家/地区:

SELECT country.name
FROM users
LEFT JOIN countries ON user.country_id = country.id
WHERE user.id = 1;


乍一看,场景 2 似乎更快,但是,在 users 表中使用 country_id FK 来保存一个连接是个好主意吗?或者我应该利用关系并深度加入?这两种情况中哪一种实际上执行得更快?

最佳答案

一个连接几乎总是比两个连接更快,但这里的问题不应该是哪个更快,而是哪个更易于维护(另请参阅 When to optimize )。

您确实遇到性能问题吗?即使在这种情况下,数据可能永远不会改变(至少,城市通常不会改变国家/地区),但表之间的数据仍然存在过时的风险。所以这里的问题是,它足够快吗?

这些类型的优化通常在性能方面几乎没有什么好处,但会带来数据过时的风险,并使事情变得更加复杂。

关于mysql - 深度连接性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26887982/

相关文章:

java - 更新数据到mysql数据库表失败

arrays - NET中的Array.Join?

mysql - MySQL中根据两张表进行选择

java - 对于 Hibernate 中的 MySQL 6,我应该使用哪种方言?

mysql - 在 ejabberd 中存储消息

python - 为什么 str.replace 对于单个异常值要慢得多?

c# - 如何测量 C# 中的子进程启动时间?

jquery - 通过每次匹配时删除 td 来优化算法

mysql - 有条件连接另一个表

mysql - 本月和上个月出勤的 SQL 子查询