• count详述


    存储引擎的不同

    MyISAM引擎会把一个表的总行数记录下来,所以在执行count(*)的时候会直接返回数量,执行效率很高。

    InnoDB因为增加了版本控制(MVCC)的原因,同时有多个事务访问数据并且有更新操作的时候,每个事务需要维护自己的可见性,那么每个事务查询到的行数也是不同的,所以不能缓存具体的行数,每次都需要count一下所有的行数。

    count(1)、count(*)和count(列名)的区别

    count(1)count(*)count(列名)
    作用统计表中的所有的记录数统计表中的所有的记录数统计该字段在表中出现的次数
    是否包含字段为null包含包含不包含
    区别count(1)和count(*)基本没差别,实际建议count(*)

    效率

    无where条件情况

    1. 列名为主键,count(列名)会比count(1)快
    2. 列名不为主键,count(1)会比count(列名)快
    3. 如果表有多个列且没有主键,则count(1)的执行效率优于count(*)
    4. 如果有主键,则count(主键)的执行效率是最优的
    5. 如果表只有一个字段,则count(*)最优

    有where条件情况

    根据结果count一下所有的行数,其性能更依赖于where条件

    简单总结

    count(*) :它会获取所有行的数据,不做任何处理,行数加1

    count(1):它会获取所有行的数据,每行固定值1,也是行数加1

    count(id):id代表主键,它需要从所有行的数据中解析出id字段,其中id肯定都不为NULL,行数加1

    count(普通索引列):它需要从所有行的数据中解析出普通索引列,然后判断是否为NULL,如果不是NULL,则行数+1

    count(未加索引列):它会全表扫描获取所有数据,解析中未加索引列,然后判断是否为NULL,如果不是NULL,则行数+1

    count的性能从高到低是:count(*) ≈ count(1) > count(id) > count(普通索引列) > count(未加索引列)

  • 相关阅读:
    x86处理器指令
    语义推理的功能组件动态绑定研究
    消息中间件rabbitmq
    JAVA计算机毕业设计在线辅导答疑系统Mybatis+源码+数据库+lw文档+系统+调试部署
    CentOS7---部署Tomcat和安装Jpress
    JDBC 版本和历史
    把前端HTML+CSS+JavaScript脚本嵌入WP的页面中
    ChatGPT+Mermaid自然语言流程图形化产出小试
    3428. 放苹果
    Java NIO 通信基础
  • 原文地址:https://blog.csdn.net/lee_nacl/article/details/128170809