新手提问。我正在开发一个仅使用行级二进制日志记录的 MySQL 项目。不会有复制。由于日志记录是行级的,因此函数是否具有确定性是否重要?从手册中,我的理解是它没有。
20 年 6 月 9 日添加:
我添加了一个我认为不确定的示例;如果我错了,请告诉我。对于给定的数据状态,结果将始终相同,返回一组行中的最高日期值,但对于给定患者 ID 的相同输入,并不总是返回相同的值,因为它会随着时间而变化。那正确吗?
CREATE FUNCTION `last_enc_date`(patient INT) RETURNS date
BEGIN
# Returns the date of the most recent encounter (of any kind) for patient
DECLARE lastvisit DATE;
SELECT MAX(DATE)
INTO lastvisit
FROM encounters
WHERE personid = patient;
RETURN lastvisit;
END
你的理解是正确的。即使使用非确定性函数,RBR 也是安全的。
问题是,这有什么关系吗?非确定性函数被认为对语句级复制不安全这一事实只是它们非确定性的一个副作用。无论复制如何,还有其他影响:它们与函数调用优化有关。具体来说,在查询执行期间可能不会经常调用声明为确定性的函数,从而提高查询性能。例如,
where
子句中的确定性函数只会被调用一次(除非它引用表列);将为每一行调用一个非确定性的。文档中解释了更多潜在影响。换句话说,将确定性函数错误地声明为非确定性可能会损害查询性能;将非确定性函数错误地声明为确定性可能会导致不正确的查询结果。