前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >count(*)、count(1)和count(column)区别以及执行效率高低比较

count(*)、count(1)和count(column)区别以及执行效率高低比较

作者头像
黑泽君
发布2019-03-11 11:05:05
2.9K0
发布2019-03-11 11:05:05
举报
文章被收录于专栏:黑泽君的专栏

【mysql】count(*)、count(1)和count(column)区别

小结: count(*) 对行的数目进行计算,包含NULL。 count(column) 对特定的列的值具有的行数进行计算,不包含NULL值。 count(1) 这个用法和count(*)的结果是一样的。

性能问题:   1、任何情况下 SELECT COUNT(*) FROM tablename 是最优选择;   2、尽量减少 SELECT COUNT(*) FROM tablename WHERE COL = 'value' 这种查询;   3、杜绝 SELECT COUNT(COL) FROM tablename WHERE COL2 = 'value' 的出现。

  如果表没有主键,那么count(1)count(*)快。   如果有主键,那么count(主键,联合主键)count(*)快。   如果表只有一个字段,count(*)最快。

count(1)count(主键)一样,只扫描主键。 count(*)count(非主键)一样,扫描整个表。


count(*)、count(1)、count(column)执行效率高低比较

  count(column) 会忽略为 null 的列,其他两个不会。

执行效率:

  它们三个的效率如何呢?网上说的各有各的理,当表中存在索引和主键的时候(我还没接触过设计表时不设计主键的),三者效率差不多。而我在《高性能MySQL》一书中看到这样一段话:当我们使用 count(*) 时,通配符 * 并不会像我们猜想的那样扩展成所有的列,实际上,它会忽略所有的列而直接统计所有的行数。我们发现最常见的错误就是,在括号内指定一个列却希望统计结果集的行数。如果希望知道的是结果集的行数,最好使用 count(*),这样写意义清晰,性能也会很好。

测试:   我用100万数据进行测试,发现当且仅当三者有主键时,他们的执行时间几乎相等

代码语言:javascript
复制
# 有主键:0.139s,无主键:0.283s
select count(*) from shop_order

# 有主键:0.154s,无主键:0.474s
select count(id) from shop_order

# 有主键:0.139s,无主键:0.285s
select count(1) from shop_order

# 有主键但不使用主键:0.383s (count(普通列))
select count(old_id) from shop_order

用75570717条数据进行测试,分别执行两次,测试结果如下:

代码语言:javascript
复制
# 第一次:50.660s  第二次:45.891s
select count(*) from tb_mattress_sleep_raw_data

# 第一次:59.925s  第二次:46.948s
select count(`mattress_id`) from tb_mattress_sleep_raw_data

# 第一次:90.997s  第二次:70.314s
select count(`time_zone`) from tb_mattress_sleep_raw_data

另外,在 MyISAM 中,count() 函数总是非常快的,不过这也是有前提条件的,即只有没有任何 where 条件的 count(*)才非常快,这是这个引擎的特性。


参考链接:

  https://blog.csdn.net/qq_37674858/article/details/82683596   https://blog.csdn.net/qq_30038111/article/details/82386512

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档