COUNT比拉记录和计算代码快吗?

时间:2013-04-09 21:20:34

标签: mysql sql

情况如下:

  1. 我首先需要运行查询才能知道存在多少条记录。

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

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

    例如:SELECT * FROM users;

  3. 是否有理由最初运行SELECT COUNT而不只是SELECT?也就是说,SQL中的记录数是否比实际拉回记录更快?或者它是以任何方式完成相同的工作,所以我应该避免做两个查询?

    换句话说,最好总是在第一个查询中拉出记录(不使用COUNT),然后用代码(Java)计算记录。如果用户想要运行第二个查询,那么很好,我已经有了数据。如果没有,那就转储吧。

    这里的最佳做法是什么?

4 个答案:

答案 0 :(得分:14)

如果您知道需要数据,请继续并将其拉入并在代码中计算。但是,如果您只需要计数,那么从数据库中提取计数要比实际检索行要快得多。此外,标准做法只是拉你需要的东西。

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

所有这些都不包括传输的数据越少。

关于数据库速度的经验法则是继续并亲自尝试。一般规则并不总是一个好的指标。例如,如果该表为10行,只有几列,我可能只是拉动整个事情反正在关闭的机会,我需要它,因为2个往返数据库将超过查询的成本。

答案 1 :(得分:2)

它更快,因为:

  • 数据库的设计和编写方式尽可能快地制作类似的东西。
  • 您无需将整个表格发送到您的应用程序中。只需一个整数。

你永远不应该发送整个表并统计应用程序端!

答案 2 :(得分:1)

应该考虑两件事

QUERY#1

SELECT COUNT(DISTINCT userid) from users;

使用userid索引可以更快地进行此查询;如果你没有关于userid的索引,并且你已经没有以userid开头的索引,那么运行这个

ALTER TABLE user ADD INDEX (userid);

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

QUERY#2

SELECT * from users;

为什么要费心去取每行中的每一列来计算行?

您可以用

替换它
SELECT COUNT(id) FROM users;

其中id是PRIMARY KEY或

SELECT COUNT(1) FROM users;

您必须对哪个查询更快,SELECT COUNT(id)SELECT COUNT(1)

进行基准测试

EPILOGUE

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

答案 3 :(得分:0)

仅仅是个人意见:

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

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