5 个答案:
答案 0 :(得分:14)
来自MySQL 5.0参考:
对例程性质的评估基于创建者的“诚实”:MySQL不会检查声明为DETERMINISTIC的例程是否没有产生非确定性结果的语句。但是,错误地说明例程可能会影响结果或影响性能。将非确定性例程声明为DETERMINISTIC可能会导致优化程序选择错误的执行计划,从而导致意外结果。将确定性例程声明为NONDETERMINISTIC可能会导致不使用可用的优化,从而降低性能。在MySQL 5.0.44之前,DETERMINISTIC特性被接受,但优化器不使用。
所以你有它,你可以将存储的例程标记为DETERMINISTIC,即使它不是,但它可能会导致意外的结果或性能问题。
答案 1 :(得分:12)
DETERMINISTIC结果不是指在不同时间返回的不同结果集(取决于平均时间内添加的数据)。此外,它是对使用相同数据的不同机器上的结果集的引用。例如,如果您有两台运行包含uuid()或引用服务器变量的函数的计算机,那么这些计算机应被视为NOT DETERMINISTIC。这在复制中很有用,因为函数调用存储在二进制日志(主服务器)中,然后也由从服务器执行。有关详细信息和示例,请参阅http://dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html
因此,确定使用DETERMINISTIC(99%的时间)是正确的,不应被视为滥用。
答案 2 :(得分:7)
我认为你的日常工作是确定性的。文档不是很清楚,这导致很多人对这个问题非常困惑,实际上更多的是关于复制而不是其他任何问题。