30 【80%的人都不知道🔥MySQL的count底层原理 - idea 的技术分享 | 小红书 - 你的生活指南】 😆 8pEXNtqjTnSNgKa 😆 http://xhslink.com/3hU0fT

假设我们的表user表中,有主键索引id,辅助索引name。

那么各种count的性能比较基本如下:count(1)>count(name)==count(*) > count(id)

  1. count(1) 在做数据统计的时候,不会将每个叶子结点的数据都读取出来,只是做个记录而已(少了数据读取出来的编码解码转换步骤,所以通常来说速率最高)。
  2. count(name) 走了辅助索引进行统计,在进行累加计算的时候,不会将 null 值算进去,但是在判断叶子节点中的 name 是否为空的时候,需要将叶子中的数据进行编解码读取出来,这个步骤比 count(1) 要消耗多了一些,所以性能仅次于 cout(1)。
  3. count(*) 如果有辅助索引的话,也会走辅助索引。底层原理和count(name) 类似,性能接近于 count(name)。
  4. count(id) 走的是主键索引,由于主键索引的叶子节点是整个行记录,所以在进行叶子节点读取的时候性能损耗回避普通的辅助索引的叶子节点读取起来要高一些,因此性能排在最后。

image.png