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 查询中没有。
我一直在使用相同的子查询来检查许多 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 查询中没有。