广告页面模板网站,做电商什么外推网站好,找人注册公司多少钱,成都房产网签查询count()不同写法的区别
COUNT(字段名)#xff1a;返回SELECT语句检索的行中值不为NULL的行数
COUNT(1)#xff1a;表示的是直接查询符合条件的数据库表的行数#xff08;会包含值为NULL的行数#xff09;。其中1指的是表中的第一个字段#xff0c;如有表 table(id, colu…count()不同写法的区别
COUNT(字段名)返回SELECT语句检索的行中值不为NULL的行数
COUNT(1)表示的是直接查询符合条件的数据库表的行数会包含值为NULL的行数。其中1指的是表中的第一个字段如有表 table(id, column1)则1指 id。
COUNT(*)表示的是直接查询符合条件的数据库表的行数会包含值为NULL的行数其中* 指所有所有字段并且是SQL92定义的标准统计行数的语法因为是标准语法所以MySQL数据库进行过很多优化推荐使用。
COUNT(1)和COUNT(*)区别
MySQL官方文档这么说 InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference. 即InnoDB 对 count(1) 和 count(*) 的进行相同操作两者性能相同。 由上述可知可以把count(*) 和 count(1) 相同对待 都是计算满足条件的行数(包括NULL)但count(*)是标准语法所以推荐使用count(*)。
count() 索引使用情况
(1) count(*)、count(1)、count(主键)
如果存在二级索引则mysql会使用二级索引计算 count(*)、count(1)、count(主键) 的值。
如果不存在二级索引则使用 主键索引聚簇索引计算 count(*)、count(1)、count(主键) 的值。
因为二级索引只存主键值而没存真实数据所以二级索引树比主键索引树更小所以mysql优化器会选择成本更小的二级索引不过要注意成本小不意味着消耗时间少这二者不是完全等同的。
具体案例分析可参考
使用Count(*),count(主键),count(1)时是走主键索引还是二级索引SELECT COUNT(*) 是否会造成全表扫描
(2) count(非主键字段)
如果不存在包含该字段的索引则会通过全表扫描来计算 count(字段)的值。
如果存在包含该字段的二级索引则会通过扫描此二级索引 计算 count(字段) 的值。字段在索引的顺序无影响只要索引包含该字段即可利用该索引计算行数。
总结
(1) count(*)、count(1)、count(主键) 如果存在任何一个二级索引就会通过二级索引计算否则使用主键索引
(2) count(非主键) 如果存在包含该字段的索引则通过索引计算否则会使用全表扫描