MySQL中 count(*)、count(主键id)、count(字段)和count(1)的区别

标题 count() 函数不同执行方式的执行区别

count(*) :对于这个命令,会每遍历一条数据进行累加,排除全字段为空的数据情况下 count++

count(1) :相当于新加一列,列值为1,此时每一行数据都会进行累加 count++

count(主键字段) :对于主键进行遍历,然后按行累加 count++【主键不为空】

count(普通字段) :针对普通字段进行逐行遍历,每当该字段值不为空的时候进行累加 1

count()函数执行效率

count(普通字段)< count(主键字段)< count(1)≈ count(*)

count() 函数实际执行的优化

常规情况下:

对于count(*) ,count(1) 和count(主键)而言,在底层的执行都是通过查询 主键索引树来进行遍历,只要遍历一个索引树就进行加一,这样就会将速率提高,对于一定程度而言,三者的查询效率的几乎相近的

但是对于count(主键) 而言,实际在执行主键索引树时,他会将查询的id 进行返回 ,然后再进行累加,所以一定程度上速率是比前两者的速率要慢的。

对于count(普通字段) 而言,在查询的时候是不走索引树的,但是在执行的时候会进行全表扫描,然后判断是否为空再进行累加

在创建普通索引时:

对于mysql底层而言,主键索引又叫聚簇索引,普通索引为非聚簇索引

对于主键索引而言,我们每一个的叶子节点存储的是所有数据(一整行数据)
对于非主键索引而言,每一个叶子节点存储的是只有主键id

在具体执行查询的时候,主键索引的内存比较大,非主键索引的内存比较小,故在这里mysql底层做出优化

当只有主键索引时,查询主键索引树,当既有主键索引和普通索引的时候,优先查询普通索引进行count

你可能感兴趣的:(mysql,数据库)