gpt4 book ai didi

mysql - 为什么 OpenCart 使用子查询而不是 LEFT JOIN?

转载 作者:行者123 更新时间:2023-11-29 09:49:01 25 4
gpt4 key购买 nike

最近我在研究 opencart 源代码,我发现它使用子查询而不是 LEFT JOIN。

Opencart v3在文件 admin/model/user/user.php 中查看

$query = "SELECT *, (
SELECT ug.name
FROM `" . DB_PREFIX . "user_group` ug
WHERE ug.user_group_id = u.user_group_id
) AS user_group
FROM `" . DB_PREFIX . "user` u
WHERE u.user_id = '" . (int)$user_id . "'";

我会这样使用

$query = "SELECT u.*, ug.name AS user_group 
FROM `" . DB_PREFIX . "user` u
LEFT JOIN `" . DB_PREFIX . "user_group` ug ON ug.user_group_id = u.user_group_id
WHERE u.user_id = '" . (int)$user_id . "'";

我的问题是,在 Select 列中使用子查询是否有任何性能改进?如果是的话怎么会这样?如果不是,那么为什么这个主要社区要使用这种方式?我还发现他们没有使用外键,知道为什么吗?

最佳答案

当外部查询处理大量行时,相关子查询可能会成为性能问题;因为子查询是针对每一行执行的。

看起来这个查询最多返回一行,因为看起来user_id是一个唯一的键。由于外部查询(最多)返回一行,因此子查询将仅执行一次。

看起来user_group_iduser_group表中的唯一键,因此子查询最多返回一行。 (在更一般的情况下,如果子查询返回多于一行,我们会收到错误。使用 LEFT JOIN,我们会返回多行。)

<小时/>

问:在 Select 列中使用子查询是否会提高性能?

答:这两种形式都不会造成性能损失。具有相关子查询的形式可能会更快,但差异并不显着。

问:如果是,怎么会这样?如果不是,那么为什么这个主要社区要使用这种方式?

答:这是有效的 SQL,它有效,并且没有动力进行更改。

问:我还发现他们没有使用外键,知道为什么吗?

答:没有要求 RDBMS 强制引用完整性;如果应用程序正在处理它,那么我们就可以避免数据库的开销。

某些存储引擎(例如 MyISAM)不强制执行外键约束。

外键有时会干扰管理操作,例如清空和重新加载表。

<小时/>

这都是设计决策;给猫剥皮的方法有很多种。 (我们只是在这里粗略地了解一下;更深入的研究将更多地基于意见,以争论哪种方式剥猫皮更好。)

关于mysql - 为什么 OpenCart 使用子查询而不是 LEFT JOIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55165828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com