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

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

    例如:
    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;