我有三个名为 users
、cities
和 countries
的表,这两个场景:
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/