0

MySQL has to know the deterministic of a defined function, official document says:

Several characteristics provide information about the nature of data use by the routine. In MySQL, these characteristics are advisory only.

Does that mean deterministic of a function does not affect how the function is executed?

4

3 回答 3

0

That sentence to me would imply that they may be used by mysql, but mysql also may not.

Still a good idea to use 'deterministic', but you should actually measure to see if the query execution strategy matches your expectations.

于 2012-12-03T01:23:02.123 回答
0

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

如果你将一个函数标记为 DETERMINISTIC,但它不是,那么 MySQL 可能不会在它应该调用它时调用它,从而导致潜在的错误结果。例如,如果使用值 '3' 调用它可能会产生一次结果 '7',然后是 '8',那么如果 MySQL 认为它是 DETERMINISTIC,那么两次都可能得到 '7'。

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

于 2012-12-03T02:08:09.280 回答
0

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

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

(b) 我们有性能问题,我们需要尝试 DETERMINISTIC 来加快速度。

否则,为什么要冒着风险让优化器基于我们对它所做的事情的误解而提供错误的结果呢?

于 2015-06-16T23:38:47.257 回答