https://www.jianshu.com/p/1b0a1f641e80]

不同引擎count(*)实现方式不同

  • MyISAM引擎把一个表的总行数记录在了磁盘上,执行count(*)会直接返回这个数值,效率很高。
  • InnoDB,执行count(*),需要把数据一行行的从引擎中读出来,然后累积计数。

InnoDB对count(*)的优化

  • 我们知道,InnoDB是索引组织表,主键索引的叶子节点保存的是数据;普通索引的叶子节点保存的是主键值。所以,普通索引比主键索引小,对于count(*)这样的操作,遍历哪个索引树得到的结果逻辑上是一样的,因此,MySQL优化器会找到最小的索引树来遍历,在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库系统设计的通用法则之一。

show table status与count(*)

  • show table status命令输出结果中有一个TABLE_ROW值,但不能代替cout(*),因为它是通过采样统计计算的,误差较大(可能达到40%-50%)。

聚合函数count()

  • count()是一个聚合函数,对于返回结果,一行行的判断,如果count函数的参数不是NULL,累计值就+1,否则不加,最后返回累计值。
  • count(*)、count(id)、count(1)都表示返回满足查询条件的结果集的总行数;count(字段),表示返回满足条件的数据行里面参数字段不为NULL的结果的总个数。

不同count参数性能对比

    • count(主键id):InnoDB引擎会遍历整张表,把每一行id值都取出来,返给server层。server层拿到id后,判断是不可能为空的,就按行累加,不再对每个值进行NULL判断。
    • count(1):InnoDB引擎会遍历整张表,但不取值。server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加,不再对每个值进行NULL判断。
        count(1)比count(主键id)执行的要快,因为从引擎放回id会涉及解析数据行,以及拷贝字段值的操作。
    • count(字段):
        1、如果参数字段定义NOT NULL,判断是不可能为空的,按行累加,不再对每个值进行NULL判断。
        2、如果参数字段定义允许为NULL,那么执行的时候,判断可能是NULL,还要把值取出来再判断一下,不是NULL才累加。
        这也是定义字段时建议设置NOT NULL的原因之一。
    • count(*):前面说过,InnoDB专门对它做了优化
    • 结论:对于InnoDB引擎,按效率排序,count(字段) < count(主键id) < count(1) ≈ count(*),建议尽量使用count(*)

MySQL count的更多相关文章

  1. mysql count group by统计条数方法

    mysql count group by统计条数方法 mysql 分组之后如何统计记录条数? gourp by 之后的 count,把group by查询结果当成一个表再count一次select c ...

  2. Mysql count+if 函数结合使用

    Mysql count+if 函数结合使用 果林椰子 关注 2017.05.18 13:48* 字数 508 阅读 148评论 0喜欢 1 涉及函数 count函数 mysql中count函数用于统计 ...

  3. MySQL COUNT(*) & COUNT(1) & COUNT(col) 比较分析

    在面试的时候我们会经常遇到这个问题: MySQL 中,COUNT(*).COUNT(1).COUNT(col) 有区别吗? 有区别. 接下来我们分析一下这三者有什么样的区别. 一.SQL Syntax ...

  4. mysql count的理解

    mysql count的理解 1 select count(tel) as telcount from info;如果tel列有null 将不会被统计进去 2 count(*) 这样写性能更好 3 M ...

  5. mysql COUNT()函数 语法

    mysql COUNT()函数 语法 作用:返回匹配指定条件的行数.博智达直线电机平台 语法:SELECT COUNT(*) FROM table_name mysql COUNT()函数 示例 // ...

  6. mysql count(*)和count(列)速率

    count(*)通常是对主键进行索引扫描,count(列)不一定 count(*)是统计表中所有符合的记录总数,count(列)是计算表中所有符合的列的记录数 count的时候,如果没有where限制 ...

  7. 【转】MySQL count(*)速度慢优化

    select count(*)是MySQL中用于统计记录行数最常用的方法. count方法可以返回表内精确的行数,每执行一次都会进行一次全表扫描, 以避免由于其他连接进行delete和insert引起 ...

  8. Mysql count(1) group_concat 高级用法(count 过滤条件,group_concat过滤条件)

    1.官方文档: count:COUNT(expr) [over_clause] https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.h ...

  9. mysql count(*) 和count(1)区别

    count *更快, 不要加where,否则同count(1)效率相同 sql语句对大小写不敏感,关键字一般大写,其他小写, count(*)不加where,mysql会直接返回总条数,因为mysql ...

  10. 0316 【案例】MySQL count操作优化案例一则

      转自http://blog.itpub.net/22664653/viewspace-1791124/ 一 背景 某业务的数据库定期报 thread_runing 飙高,通定位发现一个慢查询sql ...

随机推荐

  1. pycharm新建项目后按钮灰色问题

    同样适用于导入别人的新项目后无法运行问题 原因一: pycharm没有设置系统解析器 解决方法一: 打开pycharm->File->Settings->Project Interp ...

  2. Apache:编译和安装

    1.在Fedora / CentOS / Red Hat Enterprise Linux上安装 sudo yum install httpd sudo systemctl enable httpd ...

  3. python基础---python环境搭建windows版

    Python3.7.1标准安装 1.官网下载 官网地址:https://www.python.org/downloads/ 下载3.7.1 下载64/32bitwindows安装文件,下图x86-64 ...

  4. QA流程

    一.测试人员的介入时间 1.当产品经理与业务人员制定需求的时候,测试人员不宜介入: 2.当下一期的需求原型出来以后,这个时候就进入了需求评审.需求分析阶段,此时,测试人员应该介入: 3.当开发人员在编 ...

  5. 用python+openpyxl从表格中读取测试用例的多条数据,然后将执行结果写入表格中

    # -*- coding: utf-8 -*- from selenium import webdriver from openpyxl import load_workbook class mylo ...

  6. pycharm——常用快捷键操作

    编辑类(Editing): Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 类名完成Ctrl + Shift + Enter 语句完成Ctrl + P ...

  7. Docker创建mysql镜像

    原文: https://blog.csdn.net/uk8692/article/details/49386679 https://blog.csdn.net/qq362228416/article/ ...

  8. 关闭centos大页及swappiness

    首先检查THP的启用状态: [root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/defrag [always] madvise ne ...

  9. Python编写的ssh客户端[类似putty]

    转载请注明出处:http://blog.csdn.net/jmppok/article/details/17588381 windows下可以通过putty以ssh方式连接linux主机.但putty ...

  10. Wiki with Herbal Medicine

    Problem H. Wiki with Herbal MedicineInput file: standard input Time limit: 1 secondOutput file: stan ...