count(*),count(1)和count(主键)的区别

如果null参与聚集运算,则除count(*)之外其它聚集函数都忽略null。如:

ID     DD

1      e

2    null

select  count(*) from table  --结果是2

select  count(DD)  from table  ---结果是1

效率问题:

当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了!

从执行计划来看,count(1)和count(*)的效果是一样的。

但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),不过差不了多少。

这个也与表的记录数多少有关!如果1w以外的数据量,做过表分析之后,反而count(1)的用时比count(*)多了。

另外,当数据量达到10w多的时候,使用count(1)要比使用count(*)的用时稍微少点!

如果你的数据表没有主键,那么count(1)比count(*)快

如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快

如果你的表只有一个字段的话那count(*)就是最快的啦

count(*) count(1) 两者比较。主要还是要count(1)所相对应的数据字段。

如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。

因为count(*),自动会优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化的

因此:count(1)和count(*)基本没有差别!

sql调优,主要是考虑降低:consistent gets和physical reads的数量。

时间: 2024-08-29 23:47:22

count(*),count(1)和count(主键)的区别的相关文章

SQL server 聚集索引与主键的区别

主键是一个约束(constraint),他依附在一个索引上,这个索引可以是聚集索引,也可以是非聚集索引. 所以在一个(或一组)字段上有主键,只能说明他上面有个索引,但不一定就是聚集索引. 例如下面: 1 USE [pratice] 2 GO 3 CREATE TABLE #tempPKCL 4 ( 5 ID INT PRIMARY KEY CLUSTERED --聚集索引 6 ) 7 8 9 --------------------------------- 10 USE [pratice] 1

count(1),count(*),count(主键) 性能对比

前言 前段时间关于统计数量的sql问题和朋友进行了讨论,网上关于这三种查询方式说法不一,主要有以下两种说法. count(*) = count(主键) > count(1) count(主键) > count(*) > count(1) 今天对这三种方式进行探究. 数据库为mysql 5.7.12,引擎为InnoDB. 建表 CREATE TABLE `user` (   `id` int(32) NOT NULL AUTO_INCREMENT,   `name` varchar(500

主键,组合主键,聚集索引,非聚集索引,唯一索引

前言: 基于Oracle数据库谈谈索引们的问题,以及在什么情况下使用什么索引, 组合主键,怎么根据实际业务需求来定制自己的索引,主键的应用,来提升系统的性能. 1:主键? 在表中唯一的,也是聚集索引.作用于快速查询.该列唯一. Java代码 复制代码 收藏代码 1.ID NUMBER(38,0) PRIMARY KEY NOT NULL, 2:组合主键? 在表中以多个字段组成在表中是唯一的,也是聚集索引.作用于快速查询.该组合列唯一. Java代码 复制代码 收藏代码 1.CREATE TABL

14-SQLite之主键与唯一约束

一.主键 惟一地标识一行(一张表中只能有一个主键) 主键应当是对用户没有意义的(常用于索引) 永远不要更新主键,否则违反对用户没有意义原则 主键不应包含动态变化的数据,如时间戳.创建时间列.修改时间列等 在两个表的关系中,主关键字用来在一个表中引用来自于另一个表中的特定记录 语法: create table 表名称 (列名称1 数据类型 primary key, 列名称2 数据 类型,列名称3 数据类型, ...); 二.唯一约束 用来保证一个列(或一组列)中数据唯一,类似于主键,但跟主键有区别

主键外键

主键 外键 唯一键 CHECK约束 主键:是唯一的,不可重复的,它能提高查询效率,但是会减慢新增数据效率 外键:主键是本张表的主键,是唯一且非空的,而外键是另一张表中与这张表的某个字段的类型,字段名相同的字段,一般是用作关联两张或两张以上的数据表时用的. 外间的取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除.(4)更新主键记录时,同样有

Python-数据类型 主键auto_increment

1.详细的建表语句 ***** create table 表名( 字段名1 数据类型[(长度) 约束条件], 字段名2 数据类型[(长度) 约束条件] ); 解释: 类型:使用限制字段必须以什么样的数据类型传值 约束条件:约束条件是在类型之外添加一种额外的限制 为什么需要给数据分类?(189 一八九) 1.描述数据更加准确 2.节省内存空间 注意: 1. 在同一张表中,字段名是不能相同 2. 宽度和约束条件可选,字段名和类型是必须的 3.最后一个字段后不加逗号 create database d

三大框架 之 Hibernate生成策略与缓存策略(主键生成策略、持久化、持久化类划分、一级缓存、事物管理)

目录 Hibernate生成策略与缓存策略 主键生成策略 主键分类 主键的生成策略 持久化 什么是持久化 什么是持久化类 持久化类编写规则 持久化类的划分 三种状态区分 持久态对象特征 一级缓存 什么是缓存 一级缓存 一级缓存特点 一级缓存内部结构 事务管理 什么是事务 事务特性 事务的隔离级别 Hibernate设置事务的隔离级别 事务业务层连接 Hibernate生成策略与缓存策略 主键生成策略 主键分类 自然主键 主键本身就是表中的一个字段 实体中一个具体的属性,对象本身唯一的特性 创建一

Oracle里count(1)、count(*)和count(主键)哪个更快

这两天听了将近20场演讲,感觉收获很多,最深的感觉就是自己还有很长的路要走.有几个点记录一下: 昨天听老猫讲,提到一个普遍的问题就是Oracle里count(*).count(1)和count(主键)到底哪个快的问题.这个问题看起来很简单,每个人都会有自己的答案,去百度上搜会出来一大堆帖子来讲哪个更快.但是老猫说了它们三个其实是一样的,我听到之后也觉得挺诧异的,因为我记得别人跟我说过count(主键)会快,然后自己简单想了一下,觉得好像是那么回事的就没有深入去追究.接着老猫说官方有这样的说法这三

1226关于count(*)不走主键索引反而走二级索引

转自 http://www.2cto.com/database/201508/433975.html mysqlcount(*)会选哪个索引? 2015-08-19      0个评论    来源:Database.Code   收藏    我要投稿 今天在查询一个表行数的时候,发现count(1)和count(*)执行效率居然是一样的.这跟Oracle还是有区别的.遂查看两种方式的执行计划: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 mysq