-1

我有一个基本的 HFSQL 数据库,有 3 个表:Company、Person 和 Worker。每个表有约 5 列和 5000 个条目。Worker 有一个名为 IDPerson 的人的外键,以及一个名为 IDCompany 的实体的外键。

我测试了以下 2 个查询(我只更改了 INNER JOIN 的顺序):

QUERY 1(~5ms 执行时间)

SELECT *
FROM Person
INNER JOIN Worker ON Worker .IDPerson = Person.IDPerson
WHERE Worker.Company = 1;

QUERY 2(~50ms 执行时间

SELECT *
FROM Worker
INNER JOIN Person ON Worker .IDPerson = Person.IDPerson
WHERE Worker.Company = 1;

找到的条目数相同,但执行时间慢了 10 倍。为什么? INNER JOIN 不应该是对称的吗?为什么在使用 WHERE 子句时,订单的性能会提高 10 倍?

请帮助我理解这种奇怪的行为!

PS:如果我只选择一些列而不是“ ”* ,性能问题是相同的

4

1 回答 1

0

即使您需要所有列,最好选择它们而不是使用“*”。这背后的原因是让数据库知道你想要什么,而不是收集所有东西(即使你正在收集所有东西)。

如果您只选择几列,您就是在告诉数据库您知道要提取的内容,因此它只会查找特定的列,而不是通过“幕后查询”来获取所有列。

至于你两个join之间的性能差异,数据库使用大量计算来确定最佳执行计划,它会寻找要使用的索引,如果你之前运行过查询,缓存也会有这样的影响。

测试时毫不犹豫地使用一些东西来清除缓存(它可能会产生相当大的影响)

于 2021-06-10T08:10:54.573 回答