提高mysql存储函数的性能

提高mysql存储函数的性能,mysql,performance,Mysql,Performance,我有一个从SQLServer移植的存储函数,对于MySql来说速度非常慢。因为我的应用程序需要同时支持SQL Server和MySql(通过ODBC驱动程序),所以我需要这个函数。存储函数通常在“where”子句中使用,但即使只在“select”子句中使用,它也很慢 有什么技巧可以提高函数的性能吗?也许有什么有用的工具可以指出潜在的存储函数问题或慢点 它们是复杂的函数。因此,虽然函数中的一条语句相对较快,但组合起来的所有语句都较慢 此外,这些函数中还使用了视图。不知道这对事情有多大影响。这些观点

我有一个从SQLServer移植的存储函数,对于MySql来说速度非常慢。因为我的应用程序需要同时支持SQL Server和MySql(通过ODBC驱动程序),所以我需要这个函数。存储函数通常在“where”子句中使用,但即使只在“select”子句中使用,它也很慢

有什么技巧可以提高函数的性能吗?也许有什么有用的工具可以指出潜在的存储函数问题或慢点

它们是复杂的函数。因此,虽然函数中的一条语句相对较快,但组合起来的所有语句都较慢

此外,这些函数中还使用了视图。不知道这对事情有多大影响。这些观点本身似乎是在合理的时间内形成的

我知道我没有给出太多细节,但我更想寻找一个性能工具或一些高级存储函数性能提示

我确实在网上看到过很多帖子,建议人们不要在“where”子句中使用函数,但我有点为难,因为我想用相同的可执行文件在SQL Server和MySql之间来回切换,而且函数太复杂,无法直接嵌入我的应用程序中的SQL中

根据Gruber答案进行编辑,以举例说明: 以下是一个查询示例:

SELECT count(*) FROM inv USE INDEX(inv_invsku) WHERE invsku >= 'PBM116-01' AND WHMSLayer_IS_LOC_ACCESSIBLE( '', 'PFCSYS    ', invloc ) > 0 ORDER BY invsku;

如果我取消了对IS_LOC_可访问性的调用,速度会快得多。IS_LOC_ACCESSIBLE只是3个此类功能之一。它有一堆IF语句、其他表和视图的查询等。这就是为什么我称它为“复杂”的原因,因为所有这些额外的逻辑和条件路径。

您可以尝试使用查询探查器,例如中包含的查询探查器,并尝试准确地找出瓶颈所在

可能您的表没有正确索引


有时,通过在查询中移动内容,创建相同的输出,但更改内部执行路径,可以很好地改进MySQL(和SQL Server)。例如,尝试删除复杂的WHERE子句,使用复杂代码作为包装的SELECT语句的输出,您可以随后使用WHERE on。

我仍在处理您的答案,但希望我的更新能够澄清问题。我尝试了你的子查询想法(或者至少是我对这个想法的解释),但没有任何帮助。查询分析器是查看实际使用的函数,还是只查看使用该函数的查询?我所知道的所有分析器都只查看查询,而不是查询中调用的函数。我真正需要的是一个函数分析器。对于你的“四处移动”想法,你建议我怎么做?我给了你一个select语句的例子,然后我用它尝试了你的子查询想法(或者至少我对你想法的解释)。使用
WHMSLayer\u IS\u LOC\u ACCESSIBLE
函数调用作为内部
SELECT
语句的输出,并在外部
SELECT
语句中使用它来执行
WHERE
过滤。MySQL将为与WHERE子句匹配的每一行调用该函数。优化器不会从函数中提取任何代码以使整个SELECT运行得更快。我们所能做的最好的事情就是查看函数,看看是否(1)我们可以加快它的速度,或者(2)以某种方式从函数中提取它正在做的事情,并更有效地执行它。您是否愿意向我们展示函数,以及显示创建表/视图?