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

看如下数据:

 1 SQL> select count(*) from ysgl_compile_reqsub;
 2
 3   COUNT(*)
 4 ----------
 5    5288265
 6
 7 已用时间:  00: 00: 07.51
 8 SQL> select count(1) from ysgl_compile_reqsub;
 9
10   COUNT(1)
11 ----------
12    5288265
13
14 已用时间:  00: 00: 00.68
15 SQL> select count(id) from ysgl_compile_reqsub;
16
17  COUNT(ID)
18 ----------
19    5288265
20
21 已用时间:  00: 00: 00.68
22 SQL> select count(rowid) from ysgl_compile_reqsub;
23
24 COUNT(ROWID)
25 ------------
26      5288265
27
28 已用时间:  00: 00: 01.01
29 SQL> select count(rowid) from ysgl_vdata_his;
30
31 COUNT(ROWID)
32 ------------
33      5299458
34
35 已用时间:  00: 00: 09.98
36 SQL> select count(*) from ysgl_vdata_his;
37
38   COUNT(*)
39 ----------
40    5299458
41
42 已用时间:  00: 00: 00.93
43 SQL> select count(1) from ysgl_vdata_his;
44
45   COUNT(1)
46 ----------
47    5299458
48
49 已用时间:  00: 00: 00.71
50 SQL> select count(1) from ysgl_excelbasic;
51
52   COUNT(1)
53 ----------
54    3755052
55
56 已用时间:  00: 00: 04.60
57 SQL> select count(*) from ysgl_excelbasic;
58
59   COUNT(*)
60 ----------
61    3755052
62
63 已用时间:  00: 00: 00.50
64 SQL>

不考虑Null的情况:
count(1)和count(主键) 这两个只扫描主键Index就可以得到数据,
count(*)是扫描表的。
所以count(1)和count(主键)这两个效率高。
还有一种写法是count(ROWID)这也是只扫描Index的,效率高。

这个问题就是问你什么时候Oracle容易走表查询,什么时候Oracle容易走INDEX查询。
实际应用中,你得看实际情况,没准这个表没有唯一键索引呢?在CBO(ORACLE提供的一种SQL优化器)的情况下,统计情报不准确呢?

这种问题会出现好多版本的回答。测试环境不同结果也不一样,你随便键个表,看看它们的执行计划,就能看出他们的区别了。

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

时间: 2024-10-05 04:58:40

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

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

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(

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

关于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 row count: 0 expected: 1 出现这一错误的主要原因有两个       使用的是hibernate的saveOrUpdate方法保存实例.saveOrUpdate方法要求ID为null时才执行SAVE,在其它情况下执行UPDATE.在保存实例的时候是新增,但你的ID不为null,

Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 hibernate注解的基本用法 使用Session API CRUD操作对象,以及对象状态的转换 hibernate缓存的概念 get()/load()的区别到底是什么,源码分析 代理模式实现的懒加载 saveOrUpdate()/merge()的区别 Assigned(常用,一般情况使用很方便):

主键关联、外键关联的区别

主键关联.唯一外键关联 的区别 主键关联是指的一个表的主键和另外一个表的主键关联外键关联是指的一个表的主键和另外一个表的非主键关联 主键关联:    person_t:      person_id      address_id address_t      address_id      address_name 他们通过 address_id 关联是外键关联 person_t:      person_id      persion_name    address_t      perso

MYSQL INNODB主键使用varchar和int有什么区别?

本文和大家分享的主要是MYSQL 数据库主键使用varchar和int的区别,一起来看看吧,希望对大家学习mysql有所帮助. 我现在总结的3个问题: 1.tablespace中空间浪费 当然我们知道使用varchar可能会导致辅助索引比较大,因为用到varchar可能存储的字符较多,同时 在行头也存在一个可变字段字符区域(1-2)字节 而辅助索引叶子结点毕竟都存储了主键值,这样至少会多varchar数据字节数量+1(或者2) 字节- 4(int)字节空间. 如果辅助索引比较多空间浪费是可想而知

MySQL主键和索引的联系及区别

转载自:http://www.nowamagic.net/librarys/veda/detail/1954 关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.下面是主键和索引的一些区别与联系. 1. 主键一定是唯一性索引,唯一性索引并不一定就是主键. 所谓主键就是能够唯一标识表中某一行的属性或属性组