22

情况如下:

  1. 我首先需要运行查询以了解存在多少条记录。

    例如:SELECT COUNT(DISTINCT userid) from users;

  2. 通常这就是所有需要的。但是,有时(比如 30% 的时间)在第一次查询之后,用户会想要运行第二次查询,详细说明记录。

    例如:SELECT * FROM users;

是否有任何理由SELECT COUNT最初运行而不是仅仅运行SELECT运行?也就是说,让 SQL 中的记录计数比实际拉回记录要快吗?还是它在本质上做同样的工作,所以我应该避免做两个查询?

换句话说,总是在第一个查询中提取记录(而不是 use COUNT)是否更好,然后在代码中计算记录(Java)。如果用户想要运行第二个查询,那太好了,我已经有了数据。如果没有,那就扔掉它。

这里的最佳做法是什么?

4

4 回答 4

26

如果您知道需要数据,请继续将其提取并在代码中计数。但是,如果您只需要计数,从数据库中提取计数比实际检索行要快得多。此外,仅提取您需要的内容也是标准做法。

例如,如果要计算表中的所有行,大多数数据库实现不需要查看任何行。表知道它们有多少行。如果查询在where子句中有过滤器并且可以使用索引,则它再次不需要查看实际行的数据,只需计算索引中的行数。

所有这一切都没有计算传输的数据量减少。

关于数据库速度的经验法则是继续尝试自己。一般规则并不总是一个好的指标。例如,如果表是 10 行并且只有几列,我可能会在需要它的情况下将整个东西拉出来,因为 2 次往返数据库会超过查询的成本。

于 2013-04-09T21:26:49.727 回答
4

应该考虑两件事

查询 #1

SELECT COUNT(DISTINCT userid) from users;

使用索引,这个查询会快很多userid;如果您没有索引,userid并且您已经拥有的索引都没有以 开头userid,则运行以下命令:

ALTER TABLE user ADD INDEX (userid);

这将使查询优化器选择查看索引而不是触摸表。

查询 #2

SELECT * from users;

为什么要费心获取每一行中的每一列只是为了计算行数?

您可以将其替换为

SELECT COUNT(id) FROM users;

其中 id 是主键或

SELECT COUNT(1) FROM users;

您必须对哪个查询更快进行基准测试,SELECT COUNT(id)或者SELECT COUNT(1)

结语

除非您在计数时确实需要数据,否则让计数在服务器中进行。

于 2013-04-09T21:34:35.610 回答
2

它更快,因为:

  • 数据库的设计和编写方式是为了使这样的事情尽可能快。
  • 您不必将整个表格发送到您的应用程序中。只是一个整数。

您永远不应该发送整个表格并计算应用程序方面!

于 2013-04-09T21:25:12.290 回答
0

只是个人意见:

如果在 100% 的情况下不需要您的“详细”查询,那么使用count()MySQL 的功能是有意义的。它更快更便宜:MySQL 执行“繁重”的计数任务并发送一小块数据,而不是发送大量数据并让您的应用程序执行遍历记录集和计算行数的“繁重”任务。

也就是说,通常的提示:确保您的表已正确索引,以便您的查询以最佳方式运行。

于 2013-04-09T21:25:21.797 回答