微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL (HFSQL):如果 WHERE 子句,则 INNER JOIN 在性能上不对称?

如何解决SQL (HFSQL):如果 WHERE 子句,则 INNER JOIN 在性能上不对称?

我有一个基本的 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:如果我只选择一些列而不是“”*

性能问题是一样的

解决方法

即使你需要所有的列,选择它们而不是使用“*”总是一个好主意。这背后的原因是为了让数据库知道您想要什么,而不是收集所有内容(即使您正在收集所有内容)。

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

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

>

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。