代码之家  ›  专栏  ›  技术社区  ›  codemonkey

MySQL中的UDF性能

  •  4
  • codemonkey  · 技术社区  · 16 年前

    我想,如果我有MySQL的经验,我会简单地接受这一现实,调整我对UDF的使用,然后继续前进。但在使用MySQL之前,我在SQL Server上工作了5年以上。我建立了一个计费系统,它可以处理更大的数据集并依赖于 非常 大量使用标量和表值用户定义函数。这些UDF还执行查询(即不仅仅是算术运算)。在SQL Server上使用用户定义的函数时,我没有遇到这种性能损失。

    我想知道的是,这里是否有人对SQL Server和MySQL内部结构非常了解,足以证实或解释我目前的理论,即两个系统上UDF性能差异的原因。我的理论是SQLServer的优化器对UDF的评估不同于MySQL。也许是因为MySQL中的表引擎是解耦的?或者在SQL Server上使用UDF更为普遍,而MySQL引擎的优化器到目前为止还没有发展?我的想法是,SQL Server优化器可能会将包含的UDF视为周围查询的一部分(如果可能),然后将其与查询的其余部分一起优化?也许我在这里有点离题了,但我从来没有看到在SQL Server上使用UDF会有这样的性能下降。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Mitch Wheat    16 年前

    UDF具有已知的局限性和问题。请参阅: Are UDFs Harmful to SQL Server Performance?

    关于这个话题有很多文章。希望这是一个非订户访问: Beware Row-by-Row Operations in UDF Clothing

        2
  •  2
  •   Sasha Pachev    7 年前

    我知道这是一个老生常谈的问题,但它首先出现在谷歌搜索“MySQL UDF性能”的过程中,目前还没有一个充分的答案——在接受的答案中,一个链接被破坏了,另一个似乎没有谈论MySQL UDF的细节。

    首先,让我们确保我们讨论的是实际的MySQL UDF。在MySQL中,“存储函数”和UDF是有区别的。使用内部存储函数/过程解释器运行存储函数。一个UDF是用C++编写的,并被编译成一个共享库,它由MySQL服务器加载到内存中,当调用时,它作为CPU上的机器代码运行。因此,UDF的性能通常比存储函数好几个数量级。

    因此,首先,确保您讨论的是实际的UDF,而这不是一个存储函数。

    这就是说,一个写得好的UDF能够回答一个相对简单的问题,与向其提供数据以进行分析所需的I/O相比,它通常是快速的。