基于语句的复制和SQL_CALC_FOUND_ROWS

时间:2011-05-24 21:42:33

标签: mysql

我们开始使用基于语句的复制,发现它破坏了SQL_CALC_FOUND_ROWS和FOUND_ROWS(),我正在寻找解决方法。 2007年的错误报告中的评论建议使用SELECT SQL_CALC_FOUND_ROWS INTO @found_rows FROM foo,但这似乎不起作用。 MySQL说语法无效。

1 个答案:

答案 0 :(得分:1)

如果您使用的是旧版本的MySQL,则可能是您问题的一部分:http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_found-rows

  

未复制FOUND_ROWS()   可靠地使用基于语句的   复制。从MySQL开始   5.1.23,使用基于行的方式自动复制此函数   复制。

修改:仅当您处于MIXED模式时,以上情况才有效。

此外,正确的解决方法语法是:

SELECT SQL_CALC_FOUND_ROWS * FROM foo;
SET @found_rows = FOUND_ROWS();

SQL_CALC_FOUND_ROWS不返回任何内容,它只是告诉MySQL计算查询中找到的行数,即使LIMIT子句阻止所有行返回到客户端。然后,FOUND_ROWS()可用于返回SQL_CALC_FOUND_ROWS临时存储的值。

修改:上述解决方法背后的想法(如MySQL bug 12092中所述):

  

存储FOUND_ROWS()的结果   进入用户变量并使用它   相反的方式。这将复制   正确甚至在基于陈述的情况下   复制,因为它会写一个   User_var进入二进制日志。