情况如下:
我首先需要运行查询才能知道存在多少条记录。
例如:SELECT COUNT(DISTINCT userid) from users;
通常这将是所有需要的。但是,有时(例如30%的时间)在第一次查询之后,用户将希望运行第二个查询,详细说明记录。
例如:SELECT * FROM users;
是否有理由最初运行SELECT COUNT
而不只是SELECT
?也就是说,SQL中的记录数是否比实际拉回记录更快?或者它是以任何方式完成相同的工作,所以我应该避免做两个查询?
换句话说,最好总是在第一个查询中拉出记录(不使用COUNT
),然后用代码(Java)计算记录。如果用户想要运行第二个查询,那么很好,我已经有了数据。如果没有,那就转储吧。
这里的最佳做法是什么?
答案 0 :(得分:14)
如果您知道需要数据,请继续并将其拉入并在代码中计算。但是,如果您只需要计数,那么从数据库中提取计数要比实际检索行要快得多。此外,标准做法只是拉你需要的东西。
例如,如果要计算表中的所有行,则大多数数据库实现不需要查看任何行。表知道他们有多少行。如果查询在where
子句中有过滤器并且它可以使用索引,那么它也不需要查看实际行的数据,只需计算索引中的行。
所有这些都不包括传输的数据越少。
关于数据库速度的经验法则是继续并亲自尝试。一般规则并不总是一个好的指标。例如,如果该表为10行,只有几列,我可能只是拉动整个事情反正在关闭的机会,我需要它,因为2个往返数据库将超过查询的成本。
答案 1 :(得分:2)
它更快,因为:
你永远不应该发送整个表并统计应用程序端!
答案 2 :(得分:1)
应该考虑两件事
SELECT COUNT(DISTINCT userid) from users;
使用userid索引可以更快地进行此查询;如果你没有关于userid的索引,并且你已经没有以userid开头的索引,那么运行这个
ALTER TABLE user ADD INDEX (userid);
这将使查询优化器选择查看索引而不是触摸表格。
SELECT * from users;
为什么要费心去取每行中的每一列来计算行?
您可以用
替换它SELECT COUNT(id) FROM users;
其中id是PRIMARY KEY或
SELECT COUNT(1) FROM users;
您必须对哪个查询更快,SELECT COUNT(id)
或SELECT COUNT(1)
除非您在计算时确实需要数据,否则请在服务器中进行计数。
答案 3 :(得分:0)
仅仅是个人意见:
如果在100%的情况下不需要“详细”查询,那么使用MySQL的count()
函数是有意义的。它更快,更便宜:MySQL执行“繁重”计算任务并发送一小块数据,而不是发送大量数据,让您的应用程序成为遍历记录集并计算行数的“繁重”任务。
也就是说,通常的提示:确保您的表格已正确编入索引,以便您的查询以最佳方式运行。