我有一个大型数据库,我在其中使用了LIMIT,这样就不会每次都获取查询的所有结果(这不是必需的).但我有一个问题:我需要计算结果的数量.最愚蠢的解决方案如下所示,而且它奏效了:

我们只需要得到我们需要的数据:

SELECT * FROM table_name WHERE param > 3 LIMIT 10

然后我们找出长度:

SELECT COUNT(1) FROM table_name WHERE param > 3 LIMIT 10

但这个解决方案让我感到困扰,因为与所讨论的查询不同,我使用的查询很复杂,基本上必须运行两次才能得到结果.

对我来说,另一个愚蠢的解决方案是:

SELECT COUNT(1), param, anotherparam, additionalparam FROM table_name WHERE param > 3 LIMIT 10

但这只导致了一行.在这一点上,如果它只是用相同的数字填充计数行,我就可以了,我只需要这个信息,而不浪费计算时间.

有没有更好的方法来实现这一点?

顺便说一句,我不希望得到10作为COUNT的结果,我需要没有LIMIT的长度.

推荐答案

您应该(可能)运行该查询两次.

MySQL确实有一个find_row()函数,该函数报告在限制之前匹配的行数.但是使用该函数通常比运行两次查询的性能更差!

https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

...当我们在查询中为WHERE/ORDER子句建立了适当的索引时,使用两个单独的查询要比使用SQL_CALC_FOUND_ROWS的查询快得多.

当然,每条规则都有例外.如果您don't有一个适当的索引来优化查询,那么运行两次查询的成本可能会更高.确保的唯一方法是使用您的数据和服务器上的查询重复该博客中显示的测试.

Mysql相关问答推荐

如何使RST(*)在巨大的数据集上快速执行?

在Join的ON分句中使用SUM()

加载数据本地infile,字段中有双引号和逗号

我需要为用户提供MySQL视图和存储的 routine ,但不是基础表

DJANGO 使用原始 MYSQL 查询计算记录数并在 html 模板中使用结果

SQL 请求:REPLACE 和通配符 %.如何做正确的事?

如何用sql找出两次之间的差异

在 MYSQL 8 中的 JSON 字段上的 SELECT 中返回所有键及其数组项

如何使用等于、喜欢和不等于在 json 字段上编写查询?

从 MySQL 8.0.12 升级到 8.0.32 时出错

SQL:如何为给定组中的所有记录 Select 一列与另一列不匹配的位置

如何在 MySQL 中查找重复值和更新值

Mysql 中相同列的相关 2 查询

谁能帮我优化where子句

使用 JOIN 计算列中的所有值

mysql 执行注释部分

使用 MySQL 在树中查找 Leaf

MySQL使用多列 Select 重复记录

NodeJS/mySQL - ER_ACCESS_DENIED_ERROR 用户'root'@'localhost'的访问被拒绝(使用密码:是)

MySQL - 重复表