SQL_CALC_FOUND_ROWS 对于单数据库用户环境是否安全和准确?

Lev*_*ith 3 mysql

我有一个大型 MySQL Web 应用程序,它使用单个用户进行所有数据库查询。我们有多个数据库运行主从复制设置。

我的问题是:我们使用 SQL_CALC_FOUND 行来获取从查询返回的记录数,就好像查询是在没有 LIMIT 子句的情况下运行的一样;我们这样做是为了在我们的前端进行分页。我担心的是,如果 Web 应用程序的两个用户登录并同时运行两个查询(请记住,每个用户都使用相同的数据库用户帐户来运行查询),当我们查询找到的行数时:

SELECT FOUND() ROWS AS total

返回的数字来自与第一个查询同时运行的不同查询的可能性可能不为零。这是一种可能性吗?上面的查询是否会返回不准确的数字,或者是否存在某种故障安全机制?

mar*_*cio 5

好吧,这可能不是一个完整的深入分析,但从开发人员的角度来看,我可以说这取决于您的服务器如何处理请求和执行应用程序。更清楚:同步异步

如果您的服务器同步处理请求,则无需担心。在这种情况下,给定两个假设用户(用户 A 和用户 B)同时发出请求,您的服务器只会首先处理一个请求,给定假设请求的所有处理都将在不同的时刻发生,因此是没有信息交叉疯狂。

但是,如果您的应用程序在许多服务器实例异步处理请求的服务器中运行,我不建议您依赖所提供的方法来计算行数。

即使在我的假设不是 100% 准确的情况下,为了理智起见,在您的应用程序中,我建议您使用旧的通用防弹双查询解决方案:

SELECT [fields] FROM [tables] WHERE [filter]
Run Code Online (Sandbox Code Playgroud)

后来我们的计数查询...

SELECT count(*) as total FROM [tables] WHERE [filter]
Run Code Online (Sandbox Code Playgroud)

没有办法出错,正如@DTest 添加的那样,这 2 种查询方法在某些环境中可以更快(请参阅他的评论中的链接)。

哦,我快速阅读了与信息函数相关的 MySQL 文档,有一点很愚蠢:

重要提示:FOUND_ROWS() 不能可靠地复制,不应与要复制的数据库一起使用。

来自:http : //dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count

  • 事实上,在某些情况下,[2 查询路线更快](http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/) (2认同)