Mysql 计数是否比提取记录和在代码中计数快?
情况如下:Mysql 计数是否比提取记录和在代码中计数快?,mysql,sql,Mysql,Sql,情况如下: 我首先需要运行一个查询来知道存在多少条记录 例如:SELECT COUNT(DISTINCT userid)from users 通常这就是所需要的一切。但是,有时(比如30%)在第一次查询之后,用户会希望运行第二次查询,详细说明记录 例如:SELECT*FROM users 是否有任何理由最初运行SELECT COUNT,而不是只运行SELECT?也就是说,SQL中的记录计数比实际收回记录快吗?或者它以任何一种方式执行基本相同的工作,因此我应该避免执行两个查询 换句话说,最好总
SELECT COUNT(DISTINCT userid)from users代码>
SELECT*FROM users代码>
SELECT COUNT
,而不是只运行SELECT
?也就是说,SQL中的记录计数比实际收回记录快吗?或者它以任何一种方式执行基本相同的工作,因此我应该避免执行两个查询
换句话说,最好总是在第一次查询中提取记录(不使用COUNT
),然后在代码(Java)中对记录进行计数。如果用户想要运行第二个查询,那么很好,我已经有了数据。如果没有,那就把它扔了
这里的最佳做法是什么?速度更快,因为:
- 数据库的设计和编写是为了使这样的事情尽可能快
- 您不必将整个表发送到应用程序中。而是一个整数
您永远不应该发送整个表并计算应用程序端只是个人意见: 如果100%的情况下不需要“详细”查询,那么使用MySQL的
count()
函数是有意义的。它更快、更便宜:MySQL执行“繁重”的计数任务并发送一小块数据,而不是发送一大块数据,并让应用程序执行遍历记录集和计算行的“繁重”任务
也就是说,通常的提示是:确保表已正确索引,以便查询以最佳方式运行。如果您知道需要数据,请继续提取数据并在代码中计数。但是,如果只需要计数,那么从数据库中提取计数要比实际检索行快得多。此外,标准做法是只拉你需要的东西 例如,如果要计算表中的所有行,大多数数据库实现不需要查看任何行。表知道它们有多少行。如果查询在
where
子句中有过滤器,并且可以使用索引,那么它也不需要查看实际行的数据,只需从索引中计算行数
所有这些都不包括传输的更少数据
关于数据库速度的经验法则是,自己动手试试。一般规则并不总是一个好的指标。例如,如果表有10行,只有几列,我可能会在我需要它的时候把整个表都拉出来,因为到数据库的两次往返将超过查询的成本。应该考虑两件事 问题#1 使用
userid
上的索引,查询速度会快得多;如果您在userid
上没有索引,并且没有以userid
开头的索引,则运行以下操作:
ALTER TABLE user ADD INDEX (userid);
这将使查询优化器选择查看索引而不是触摸表
问题2
为什么要费心去获取每一行中的每一列来计算行数呢
你可以用
SELECT COUNT(id) FROM users;
其中id是主键或
SELECT COUNT(1) FROM users;
您必须对哪个查询更快进行基准测试,选择计数(id)
或选择计数(1)
后记
除非您在计数时确实需要数据,否则让计数在服务器中进行。在SQL中运行计数要快得多。除此之外,您不需要通过线路发送整个表,只需发送一个整数值@Blorgbeard是的,我知道使用COUNT意味着需要传输的数据要少得多,但是与SQL server相比,执行查询的总成本是多少?(我知道这取决于很多因素。我只是想知道最佳做法是什么。)是的。2) 你自己试试看。
SELECT COUNT(id) FROM users;
SELECT COUNT(1) FROM users;