请选择 进入手机版 | 继续访问电脑版

MySQL中的count(*)

[复制链接]
菜鸡 发表于 2020-12-31 19:00:40 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
MySQL中的count(*)

MySQL中的count(*)

当我们要统计表中数据记载的总数时,总会使用count()和count(1)来举行查询,在MySQL5.6之后的版本,count()和count(1)是等价的,这里不举行过多讨论。
使用count(*)时,如果存在主键索引之外的索引,MySQL会如何选择呢?

首先我们知道MySQL的索引是使用B+树实现的,B+树的特性之一就是一个节点可以生存多个关键字,而关键字的占用的空间越小,节点占用也就越小,树就更加的“矮胖”,从而同样的容量我们可以生存更多的数据,反过来查询的时候我们一次IO读取的数据巨细是有限的,关键字越小,则我们一次IO能读取更多的数据,也就淘汰了IO的次数。
由此,理论上我们可以知道,在其他条件相同时,索引的长度越小,遍历耗费的时间就越少,被选择的优先级也就越高。
例一:

  1. explain SELECT count(*) FROM pp_monitor_tb_item;
复制代码
执行的效果如下:使用的是source字段的索引

pp_monitor_tb_item表的全部索引:

可以看到pp_monitor_tb_item中除主键外区分度最高的字段是item_id,但是却选用了索引基数只有4的source的索引树,因为他的索引数据范例为tinyint,key_len只有一个字节,为什么不选is_good_price呢,这个问题我们之后再讲。
source字段的界说

另外,另有一个优化count()速度的小技巧,pp_monitor_tb_item中的item_id是UK,如果要查询它的差别值的数量,可以用count(*)来代替,使用count(item_id)的话并不是最高效的:

因为item_id的长度为137,足足是source字段的137倍,在数据量非常大的时候效率相差很大,好比就是现在这张表虽然只有60万条数据,效率也相差较大:
二级索引数据长度大于即是主键索引时,还会使用二级索引吗?

  1. explain select count(*) from queue_message;
复制代码

表queue_message中,主键id和queue_id都是int(11),长度一样

但是照旧使用了queue的索引树,原因如下:
因为****Innodb是索引组织表,主键索引树的叶子节点是数据,而平常索引树的叶子节点是主键值,索引平常索引树要小许多,耗费时间也就更少。

来源:https://blog.csdn.net/dk1543100966/article/details/111929788
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )