我有三个表,分别命名为用户
、城市
和国家
,这两个场景:
获取任何用户的国家/地区:
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;
获取任何用户的国家/地区:
SELECT country.name
FROM users
LEFT JOIN countries ON user.country_id = country.id
WHERE user.id = 1;
乍一看,场景2似乎更快,但是,在用户表中使用country_id
FK来保存一个连接是不是一个好主意?或者我应该利用关系,深度加入?这两个场景中的哪一个实际上执行得更快?
一个连接几乎总是比两个连接快,但这里的问题不应该是哪一个更快,而应该是哪一个更易于维护(还要考虑何时进行优化)。
你真的有性能问题吗?即使在这种情况下,数据可能永远不会改变(至少,城市通常不会改变国家),但表之间的数据仍然存在过时的风险。所以这里的问题是,速度够快吗?
这些类型的优化通常在性能方面没有什么好处,但会带来数据过时的风险,使事情变得更加复杂。
在第一种情况下,您是基于主键对三个表进行查找,并在第二种情况下将其减少到只有两个表。这就是我认为的微优化。除非表很大(数百万行),或者写入速度足够快,导致锁争用,否则您不会看到显著的性能回报。