美文网首页Hive/SqlMySQL
count(*)/count(1)/count(主键)统计效率对

count(*)/count(1)/count(主键)统计效率对

作者: 码哥说 | 来源:发表于2019-06-10 10:25 被阅读172次

    前言

    在实际业务开发中,我们常常需要count数据表的记录条数。关于使用mysql的count统计函数,大多开发者都不会有疑问,但是就使用细节上,大家的观点可能就不一致了。一派认为count(1)比count(*)要快,说count(*)要全表扫描而count(1)则不用。另一派反之。针对count(主键)和count(1)和count(*),大家几乎一致认为count(主键)效率较慢。那么实际情况是这样么?

    本次就来做个总结。

    测试

    针对mysql5.7 innodb引擎,主键为id的表,
    我们explain count(1)和count(*)以及count(id)和count(name)

    explain select SQL_NO_CACHE count(1) from province
    explain select SQL_NO_CACHE count(*) from province
    explain select SQL_NO_CACHE count(id) from province
    explain select SQL_NO_CACHE count(name) from province
    

    然后发现前三者的执行计划一摸一样


    1.png

    而count(name)显然效率较低


    2.png

    所以我们确定count(*)和count(1)以及count(主键)的效率是一致的!
    mysql底层对count()有优化,会选择最有效率的方式去执行count操作,两者没有性能差异,效率都比较高。

    总结

    一方面

    count(主键列),count(),count(1)效率差不多!
    count(非主键列)的效率往往低于count(
    ),count(1),count(主键列)!

    另一方面

    count(1),count(*)会统计表中的所有的记录数,包含字段为null 的记录;
    count(列名) 会统计该字段在表中出现的次数,不统计字段为null 的记录。

    请关注我的订阅号

    订阅号.png

    相关文章

      网友评论

        本文标题:count(*)/count(1)/count(主键)统计效率对

        本文链接:https://www.haomeiwen.com/subject/azsaxctx.html