“确定性”如何影响MySQL执行定义函数的方式?

时间:2012-12-03 01:18:37

标签: mysql database

MySQL必须知道已定义函数的确定性,官方文档说:

  

几个特征提供了有关例程使用数据性质的信息。在MySQL中,这些特征仅供参考。

这是否意味着函数的确定性不会影响函数的执行方式?

3 个答案:

答案 0 :(得分:0)

对我来说这句话意味着他们可能被mysql使用,但mysql也可能没有。

使用'确定性'仍然是一个好主意,但你应该测量一下,看看查询执行策略是否符合你的预期。

答案 1 :(得分:0)

如果我不得不猜测,我会说MySQL将DETERMINISTIC函数视为具有真正的参照完整性。因此,如果使用相同的参数调用函数,它将始终给出相同的结果。这样做的结果是,如果一个函数将被多次使用相同的参数调用,MySQL可能会选择重新排序执行,以便它只被调用一次,或者它可能会缓存结果。我在Google上找不到关于MySQL在优化确定性函数时所做的确切内容,但我怀疑它不会是我指定的内容。

如果您将某个函数标记为DETERMINISTIC,而不是,则MySQL可能不会在应该的时候调用它,从而导致可能不正确的结果。例如,如果使用值“3”调用它可能会产生一次“7”的结果,然后再产生“8”,那么如果MySQL认为它是“确定性的”,那么你可能会得到“7”。

在任何情况下,如果你的函数是真正的确定性(也就是说,它没有副作用,并且除了传递给它之外的任何数据都没有读取),那么将它标记为DETERMINISTIC不会对任何事情造成伤害,如果优化器足够智能,可以重新排序执行或减少调用次数。如果你的函数读取或修改数据,或者有其他一些副作用,那么你肯定不会将它标记为DETERMINISTIC,并且可能通过将其标记为DETERMINISTIC来创建问题,因为MySQL可能会选择执行计划会导致来自该功能的错误结果。换句话说,不要骗MySQL,你会没事的。

答案 2 :(得分:0)

siride的答案是我可以在网上找到的最多讨论。但是如果将DETERMINISTIC与MODIFIES SQL DATA结合使用会发生什么?并且查询可能在任何给定日期都是确定性的,但不是在几天之间(例如,它基于很少更改的查找表)。

我对此的工作意见是避免使用DETERMINISTIC,除非 (a)该函数实际上是数学上确定的(例如,返回输入* 2)或

(b)我们遇到了性能问题,我们需要尝试使用DETERMINISTIC来加快速度。

否则,为什么要冒这样的风险,即优化器根据我们对它的误解提供错误的结果?