MySQL 性能 - 子查询与自定义函数

MySQL Performance - Sub Query vs Custom Function

我一直在使用相同的子查询来检查许多 SQL 中的特定功能。例如复杂的用户权限检查。

在这种情况下,使用子查询和使用自定义函数哪个性能更好?

子查询如下:

(SELECT 1 FROM `perm_categories_map` WHERE whatever={parentTable.whatever} AND category_id={Constant})

其用法示例为

... AND EXISTS (SELECT 1 FROM `perm_categories_map` WHERE whatever={parentTable.whatever} AND category_id={Constant}) ...

我将创建一个名为 check_perm 的函数,以便我可以像 ... AND check_perm({parentTable.whatever}, {constant}) ...

那样调用

但在做之前,我想确认函数从性能角度来看比子查询更快。

我认为函数比子查询快。你怎么看?

哪个对您来说效果更好?没有看到您的代码,没有人能够告诉您。如果您的函数只是执行完全相同的查询,我认为该函数不会更快,除非子查询以某种方式导致您的整个查询被错误优化。尝试一下,看看是唯一真正的答案。没有任何可以使它们更快的函数结果缓存;甚至内置函数也不会被缓存,请参阅 .

EXISTS(SELECT 1 ... )

是一个特殊的构造,称为“semi-join”。它说“执行以下 SELECT 但是 在找到匹配项后立即停止。”

同一“子查询”((SELECT 1 ... )) 的任何其他使用都将 运行 完成,可能会产生多行,每行包含 1

所以,EXISTS 更快,至少在某些情况下是这样。

EXISTS 视为返回 TRUE/FALSE(或等价的 1/0)的布尔函数。另外 SELECT 里面的 1 可以是任何东西。

MariaDB 有一个子查询缓存; MySQL 没有。

存储例程中的“解析”可能有一些缓存(参见 PREPARE 及其朋友),但在 stand-alone 查询中没有。