细品SELECT COUNT语句

我们在操作数据库时,统计数量函数COUNT被经常使用到,今天我们就来细品SELECT COUNT函数

认识COUNT

1、COUNT(expr),返回SELECT语句检索的行中expr的值不为NULL的数量。结果是一个BIGINT值。

2、如果查询结果没有命中任何记录,则返回0。

3、COUNT(*)的统计结果中,会包含值为NULL的行数。

COUNT(列名)、 COUNT(常量)、 COUNT(*)的区别

1、常量是个固定值,肯定不为NULL,*时整行查询,也不为NULL,列名的查询结果可能为空。所有,COUNT(常量)和COUNT(*)是查询符合条件的数据库表的行数,COUNT(列名)表示的是查询符合条件的列值不为NULL的行数。

2、count(*)会统计值为NULL的行,而count(列名)不会统计列为NULL值的行。

3、不可以使用count(列名)或count(常量)来代替count(*),count(*)时SQL92定义的标准统计行数的语法,跟数据库、NULL和非NULL无关。

COUNT(字段)

他的查询进行的是全表扫描,然后判断指定字段的值是不是NULL,不是则累加。

相比count(*),count(字段)多了个步骤就是判断所查询的字段是否为NULL,所以他的性能要比count(*)慢。

COUNT(*)和COUNT(1)

数据库对两者的优化是完全应用的,所以不存在谁快谁慢。但是建议使用count(*),因为这个是SQL92定义的标准统计行数语法。

COUNT(*)的优化

MyISAM:他把表的总行数单独记录出来,如果从一张表中使用COUNT(*)进行查询的时候,当没有where条件时可以直接返回这个记录下来的数值就可以了。MyISAM之所以可以把表中的总行数记录下来,是因为他的数据库是表级锁,不会有并发的数据库修改,所以查询到的行数是准确的。

InnoDB:选择最小的非主键索引来扫表。所以,我们建表的时候,除了主键索引以外,还要创建一个非主键索引。

OVER!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值