汕头免费建设网站制作,企业网站建设框架图,百度seo点击器,江汉区建设局官方网站分页查询数据#xff0c;需要返回total#xff0c;而这个值一般都是通过count函数实现。但是#xff0c;针对count函数#xff0c;有多种写法#xff0c;如count(*)、count(1) 和 count(column)等。本文主要介绍以上几种写法的差异。 注意#xff0c;这里仅针对MySQL数据…分页查询数据需要返回total而这个值一般都是通过count函数实现。但是针对count函数有多种写法如count(*)、count(1) 和 count(column)等。本文主要介绍以上几种写法的差异。 注意这里仅针对MySQL数据库其他类型的数据库仅供参考。
count()函数简介
count() 函数是标准SQL提供的一个聚合函数可以用来统计某个列值的数量或统计表的行数。count() 函数可以是一个表达式该表达式可以是列名、常量、特定字符等。常见的用法有以下三种 count(1) 用来统计表中的行数 count(*) 用来统计表中的行数 count(column_name) 用来统计指定列值的数目(不统计NULL值)。 需要说明的是因为count函数的参数是表达式所以实际用法有很多但是最常用的还是上面三种形式。
count(*)和count(1)
count(*)和count(1)都可以用来统计表中的行数使用上没有差异。
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.但推荐使用count()因为这是SQL92定义的标准统计行数的语法。 在使用count()时要注意不同存储引擎对其优化效果这里主要介绍MyISAM 引擎和InnoDB 引擎对count(*)的优化。 对于 MyISAM 引擎会把表的总行数存在了磁盘上存放在 information_schema 库中的 PARTITIONS 表中在不加 where 条件时执行 count() 时会直接返回这个总数因此效率很高但是在加 where 限定语句的时候 MySQL 需要对全表进行检索从而得出 count 的总数。MyISAM不支持事务使用的锁是表级锁不会有并发的行操作所以查询的结果是准确的。 而 InnoDB 引擎并没有像 MyISAM 那样把表的总行数存储在磁盘而是在执行 count( )时在不加 where 限定语句时MySQL Server 层需要把数据从引擎里面读出来然后逐行累加得出总数如果加了 where 限定语句需要根据 where 条件从引擎里面筛选出数据然后累加得出总数。InnoDB支持事务并且支持行级锁行可能被并行修改那么缓存记录不准确。
count(column)
count(column_name) 用来统计指定列值的数目(不统计NULL值)。 如果column_name是ID等主键字段或非空字段那么统计的结果和count(1)和count(*)的值一样。需要说明的是对于 MyISAM 引擎如果不加 where 条件时直接返回的表中保存的数据总行数值如果加 where 条件时需要走主键索引筛选出值后再统计。对于 InnoDB 引擎不加 where 条件时count(id) 和 count(*) 的处理方式一样MySQL优化器会选择最小树索引age 索引进行遍历统计加 where 条件时需要走主键索引筛选出值后再统计。 如果column_name是非主键字段那么只会统计列值为NULL的行数需要说明的是就这种情况下不管在 InnoDB 引擎 还是在 MyISAM引擎中非主键这个字段如果添加了索引且覆盖该字段则可基于索引统计行数如果未添加索引则会触发全表扫描。
总结
基于count()函数统计行数时count(*)和count(1)都可以用来统计表中的行数基于SQL规范考虑推荐使用count(*)。注意在使用count(*)时要注意不同存储引擎的支持事务的水平如MyISAM不支持事务使用的锁是表级锁不会有并发的行操作所以查询的结果是准确的。InnoDB支持事务并且支持行级锁行可能被并行修改那么缓存记录不准确。且不加where条件时MyISAM 引擎会直接返回这个总数。 基于count(column_name) 统计指定列值的数目时要注意区分主键字段和非主键字段。因为主键字段非空所以统计的结果和count(1)和count(*)的值一样。且不加where条件时MyISAM 引擎会直接返回这个总数。如果是非主键字段不会统计NULL值所以统计的结果和count(1)和count(*)的值可能不一样。且会基于该字段是否使用了索引决定是否基于索引统计还是全表扫描统计。
参考
https://www.runoob.com/sql/sql-func-count.html SQL COUNT() 函数 https://zhuanlan.zhihu.com/p/572387666 深度剖析MySQL count() 函数这下彻底明白了 https://www.cnblogs.com/hider/p/11726690.html MySQL学习笔记count(1)、count()、count字段的区别 https://zhuanlan.zhihu.com/p/28397595 高性能MySQL——Count(1) OR Count() https://zhuanlan.zhihu.com/p/391861774 SQL中的count(1)、count(*) 与 count(列名) 到底有什么区别 高性能MySQL Baron Scbwartz, Peter Zaitsev, Vadim Tkacbenko 著 宁海元、周振兴、彭立勋、翟卫祥 等译