mysql count(0) count(*) count(主键) count(非空字段) 效率比较

写代码的时候经理在背后说了一句count(0)的效率高于count(*) ,索性全部测试了一下

结论:1、count(0)效率等于count(*)等于count(主键)等于count(非空字段)

但是 唯一的区别就是count只会统计非空字段

系统配置

processor	: 0
vendor_id : GenuineIntel
cpu family : 6
model : 85
model name : Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz
stepping : 4
microcode : 0x1
cpu MHz : 2499.986
cache size : 33792 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f rdseed adx smap avx512cd xsaveopt xsavec xgetbv1
bugs :
bogomips : 4999.97
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management: MemTotal:        2048212 kB
MemFree:           74828 kB
MemAvailable:    1449236 kB
Buffers:           11572 kB
Cached:          1472124 kB
SwapCached:            0 kB
Active:          1460916 kB
Inactive:         432892 kB
Active(anon):     410588 kB
Inactive(anon):     2200 kB
Active(file):    1050328 kB
Inactive(file):   430692 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        410164 kB
Mapped:            37160 kB
Shmem:              2672 kB
Slab:              61228 kB
SReclaimable:      50132 kB
SUnreclaim:        11096 kB
KernelStack:        2272 kB
PageTables:         3200 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1024104 kB
Committed_AS:     705104 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:    374784 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       53120 kB
DirectMap2M:     2043904 kB
DirectMap1G:           0 kB

表结构

CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` char(50) NOT NULL,
  `text` varchar(50) DEFAULT NULL,
  `userid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20000001 DEFAULT CHARSET=latin1

创建模拟数据

DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS `quickInsert`$$

CREATE DEFINER=`root`@`%` PROCEDURE `quickInsert`()
BEGIN DECLARE i INT;
SET i =0;
START TRANSACTION;  
WHILE i < 10000000 DO
IF i MOD 2 = 0 THEN
INSERT INTO test (NAME,TEXT,userid) VALUES (MD5(RAND()*1000),NULL,RAND()*500);
ELSE 
INSERT INTO test (NAME,TEXT,userid) VALUES (MD5(RAND()*1000),MD5(RAND()*3000),RAND()*500);
END IF;
SET i = i+1;
END WHILE;
COMMIT;
    END$$ DELIMITER ;

关闭缓存

query_cache_size =  0

mysql vserion

5.7.21-0ubuntu0.16.04.1-log

数据大小 1千万条 25~30G

CALL quickInsert();  #插入数据

count(0)测试

  • 14.030s
  • 17.094s
  • 17.391s
  • 17.398s
  • 17.081s

count(*)测试

  • 17.297s
  • 17.403s
  • 17.296s
  • 16.965s
  • 17.389s

排除系统波动,基本上没有太大差别

count(主键)

  • 16.980s
  • 16.982s
  • 17.405s
  • 17.229s
  • 17.095s

count(非空字段) 开始出现大量的不确定的时间,所以多测试了多次

  • 17.009s
  • 16.902s
  • 16.993s
  • 14.607s
  • 12.843s
  • 17.404s
  • 17.413s
  • 17.397s
  • 16.898s

可以看出基本上没有太大的区别,出现的波动,我琢磨了一下可能是阿里云上的这台服务器为突发性能的,可能不是太稳定

mysql 5.7中 count(0) count(*) count(主键) count(非空字段)效率比较的更多相关文章

  1. 在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法

    在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法   ==========方法1: --------1. 选相应 ...

  2. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

  3. SQLServer中查询表结构(表主键 、列说明、列数据类型、所有表名)的Sql语句

    SQLServer中查询表结构(表主键 .列说明.列数据类型.所有表名)的Sql语句 1.查询数据库中的所有表名称: SELECT name FROM SysObjects Where XType=' ...

  4. mysql数据库单表只有一个主键自增id字段,ibatis实现id自增

    mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid">        insert into user_id ...

  5. 关于Hibernate级联更新插入信息时提示主键不为空的问题“org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1 ”

    org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual ...

  6. MySQL中myisam和innodb的主键索引有什么区别?

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索 ...

  7. MySQL主从复制数据不一致问题【自增主键】

    前言: 今天遇到主从表不一致的情况,很奇怪为什么会出现不一致的情况,因为复制状态一直都是正常的.最后检查出现不一致的数据都是主键,原来是当时初始化数据的时候导致的.现在分析记录下这个问题,避免以后再遇 ...

  8. mysql数据库使用mybatis 插入数据时返回主键

    为了体现题目,特指的是mysql,先贴上代码: <insert id="saveBizProdOrderDetail" useGeneratedKeys="true ...

  9. Java中实现MongoDB自增主键ID

    1.了解MongoDB的ObjectId        MongoDB的文档固定是使用“_id”作为主键的,它可以是任何类型的,默认是个ObjectId对象(在Java中则表现为字符串),那么为什么M ...

随机推荐

  1. Python基础入门必备知识

    1 标识符标识符是编程时使用的名字,用于给变量.函数.语句块等命名,Python 中标识符由字母.数字.下划线组成,不能以数字开头,区分大小写. 以下划线开头的标识符有特殊含义,单下划线开头的标识符, ...

  2. 重新精读《Java 编程思想》系列之final关键字

    在java中final关键字标识无法被修改.接下来从final修饰数据.方法和类进行介绍. final数据 final用来告知编译器这一块数据是恒定不变的.数据恒定不变又如下作用: 1.一个永不改变的 ...

  3. Linux常用命令大全(三)

    Linux常用命令大全(三) 文件类型 普通文件(文本文件.数据文件.可执行的二进制文件) 目录文件 同上 差别:由成对的"I节点号.文件名"构成的列表 设备文件 (字符设备.块设 ...

  4. 「分块系列」「洛谷P4168 [Violet]」蒲公英 解题报告

    蒲公英 Description 我们把所有的蒲公英看成一个长度为\(n\)的序列(\(a_1,a_2,...a_n\)),其中\(a_i\)为一个正整数,表示第i棵蒲公英的种类的编号. 每次询问一个区 ...

  5. Scala与Mongodb实践4-----数据库操具体应用

    目的:在实践3中搭建了运算环境,这里学会如何使用该环境进行具体的运算和相关的排序组合等. 由数据库mongodb操作如find,aggregate等可知它们的返回类型是FindObservable.A ...

  6. Spring 框架学习(1)--Spring、Spring MVC扫盲

    纸上得来终觉浅,绝知此事要躬行 文章大纲 什么是spring 传统Java web应用架构 更强的Java Web应用架构--MVC框架 Spring--粘合式框架 spring的内涵 spring核 ...

  7. 四、JVM之栈与栈帧

    栈: 1.又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把 另一端称为栈底.其特性是先进后出. 2.栈是线程私有的,生命周期跟线程相同,当创 ...

  8. Logback源码分析

    在日常开发中经常通过打印日志记录程序执行的步骤或者排查问题,如下代码类似很多,但是,它是如何执行的呢? package chapters; import org.slf4j.Logger; impor ...

  9. SBT与Play配置文件

    1. 配置文件类JSON格式,符合SCALA语法规范2. :=是最常用的方法,其作用就是将key设置成expression的值,相同的key如果被多次赋值,则后面的值会覆盖掉前面的值.适用于简单类型的 ...

  10. C++读书笔记

    C与C++的不同点 C++在struct,union中定义的函数叫成员函数,在class中定义的数据叫数据成员 C++引入了三个存取权限的关键字:public,protected,private pu ...