首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)区别

count() 是一个聚合函数,对于返回结果集,一行行地判断,如果 count 函数参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件结果集总行数;而 count(字段),则表示返回满足条件数据行里面,参数“字段”不为 NULL 总个数。...注意:count(1)执行速度比count(主键 id)快原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...因为count(*)返回行一定不是空。扫描全表,但是不取值,按行累加。...看到这里,你会说优化器就不能自己判断一下吗,主键 id 肯定是非空,为什么不能按照 count(*) 来处理,多么简单优化。当然 MySQL 专门针对这个语句进行优化也不是不可以。

2.5K30
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)区别

count() 是一个聚合函数,对于返回结果集,一行行地判断,如果 count 函数参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件结果集总行数;而 count(字段),则表示返回满足条件数据行里面,参数“字段”不为 NULL 总个数。...注意:count(1)执行速度比count(主键 id)快原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...因为count(*)返回行一定不是空。扫描全表,但是不取值,按行累加。...看到这里,你会说优化器就不能自己判断一下吗,主键 id 肯定是非空,为什么不能按照 count(*) 来处理,多么简单优化。当然 MySQL 专门针对这个语句进行优化也不是不可以。

2.3K10

MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?

但是,在实际使用过程中,我们可能会遇到不同 COUNT 函数写法,比如 COUNT(*)、COUNT(主键id)、COUNT(字段) 和 COUNT(1),这些写法在效率上有何差别呢?...COUNT(*) 与 COUNT(主键id)首先,我们来看 COUNT(*) 与 COUNT(主键id) 这两个写法区别。它们都可以用来计算查询结果集中记录数量,但是,它们语义是不相同。...COUNT(*) 表示计算所有行数,而 COUNT(主键id) 表示计算主键(即唯一标识一条记录字段)不为 NULL 记录数。...这里需要注意是,如果主键是一个自增长列,那么 COUNT(*) 和 COUNT(主键id) 得到结果是相同,因为自增长列值必定不为 NULL。那么,这两种写法效率如何呢?...综上所述,我们可以得出以下结论:当查询表中不存在 WHERE 子句和 GROUP BY 子句时,COUNT(*) 可能比 COUNT(主键id) 稍微快一点。

95030

MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?

在select count(?) from t这样查询语句里面,count(*)、count(主键id)、count(字段)和count(1)等不同用法性能,有哪些差别。...count()是一个聚合函数,对于返回结果集,一行行地判断,如果count函数参数不是NULL,累计值就加1,否则不加。最后返回累计值。...所以,count(*)、count(主键id)和count(1) 都表示返回满足条件结果集总行数;而count(字段),则表示返回满足条件数据行里面,参数“字段”不为NULL总个数。...对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行id值都取出来,返回给server层。server层拿到id后,判断是不可能为空,就按行累加。...单看这两个用法差别的话,你能对比出来,count(1)执行得要比count(主键id)快。因为从引擎返回id会涉及到解析数据行,以及拷贝字段值操作。

4.6K50

数据库面试题【十九、count(字段) &count(主键 id) &count(1)&count(*)区别】

count(可空字段) 扫描全表,读到server层,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加 count(非空字段)与count(主键 id) 扫描全表,读到server层,...注意:count(1)执行速度比count(主键 id)快原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...因为count(*)返回行一定不是空。扫描全表,但是不取值,按行累加。...看到这里,你会说优化器就不能自己判断一下吗,主键 id 肯定是非空,为什么不能按照 count(*) 来处理,多么简单优化。当然 MySQL 专门针对这个语句进行优化也不是不可以。...性能对比结论 count(可空字段) < count(非空字段) = count(主键 id) < count(1) ≈ count(*)

62830

MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?「建议收藏」

在select count(?) from t这样查询语句里面,count(*)、count(主键id)、count(字段)和count(1)等不同用法性能,有哪些差别。...count()是一个聚合函数,对于返回结果集,一行行地判断,如果count函数参数不是NULL,累计值就加1,否则不加。最后返回累计值。...所以,count(*)、count(主键id)和count(1) 都表示返回满足条件结果集总行数;而count(字段),则表示返回满足条件数据行里面,参数“字段”不为NULL总个数。...对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行id值都取出来,返回给server层。server层拿到id后,判断是不可能为空,就按行累加。...单看这两个用法差别的话,你能对比出来,count(1)执行得要比count(主键id)快。因为从引擎返回id会涉及到解析数据行,以及拷贝字段值操作。

1.5K40

MySQL中count是怎样执行?———count(1),count(id),count(非索引列),count(二级索引列)分析

InnoDB找到uk_key2第一条二级索引记录,并返回给server层(注意:由于此时只是统计记录数量,所以并不需要回表)。 由于count函数参数是*,MySQL会将*当作常数0处理。...InnoDB通过二级索引记录next_record属性找到下一条二级索引记录,并返回给server层。 server层继续给count变量加1。...重复上述过程,直到InnoDB向server层返回没记录可查消息。 server层将最终count变量值发送到客户端。...---- 4. count(1),count(id),count(非索引列),count(二级索引列)分析 来看看count(1) SELECT COUNT(1) FROM demo_info; 执行计划和...再看一下count(id): explain SELECT COUNT(id) FROM demo_info;   对于count(id)来说,由于id是主键,不论是聚集索引记录,还是任意一个二级索引记录中都会包含主键字段

1.4K20

count(1)、count(*) 与 count(列名) 执行区别

从执行计划来看,count(1)和count(*)效果是一样。但是在表做过分析之后,count(1)会比count(*)用时少些(1w以内数据量),不过差不了多少。...如果count(1)是聚索引,id,那肯定是count(1)快。但是差很小。 因为count(*),自动会优化指定到那一个字段。...2、count(1) and count(字段) 两者主要区别是 count(1) 会统计表中所有的记录数,包含字段为null 记录。...count(字段) 会统计该字段在表中出现次数,忽略字段为null 情况。即不统计字段为null 记录。...,相当于行数,在统计结果时候,不会忽略列值为NULL count(1)包括了忽略所有列,用1代表代码行,在统计结果时候,不会忽略列值为NULL count(列名)只包括列名那一列,在统计结果时候

1.6K30

count(1)、count(*) 与 count (列名) 执行区别

从执行计划来看,count(1)和count(*)效果是一样。但是在表做过分析之后,count(1)会比count(*)用时少些(1w以内数据量),不过差不了多少。...如果count(1)是聚索引,id,那肯定是count(1)快。但是差很小。 因为count(*),自动会优化指定到那一个字段。...2、count(1) and count(字段) 两者主要区别是 count(1) 会统计表中所有的记录数,包含字段为null 记录。...count(字段) 会统计该字段在表中出现次数,忽略字段为null 情况。即不统计字段为null 记录。...,相当于行数,在统计结果时候,不会忽略列值为NULL count(1)包括了忽略所有列,用1代表代码行,在统计结果时候,不会忽略列值为NULL count(列名)只包括列名那一列,在统计结果时候

2.9K10

MySQL COUNT(*) COUNT(1) 与 COUNT(列) 区别

2.COUNT(*) COUNT(1) 与 COUNT(列) 功能? COUNT(*) 返回结果集中所有记录数,包含字段为 NULL 记录。 COUNT(1) 功能上等同于 COUNT(*)。...COUNT(列名) 返回结果集中指定字段不为 NULL 记录数。 3....用下面这条语句作为例子: // id 为主键值 SELECT COUNT(id) FROM t_order; 如果表里只有主键索引,没有二级索引时,那么,InnoDB 循环遍历聚簇索引,将读取到记录返回给...server 层,然后读取记录中 id 值,就会 id 值判断是否为 NULL,如果不为 NULL(主键不能为 NULL),就将 count 变量加 1。...那么,InnoDB 循环遍历聚簇索引(主键索引),将读取到记录返回给 server 层,但是不会读取记录中任何字段值,因为 COUNT 函数参数是 1,不是字段,所以不需要读取记录中字段值。

12210

count(*)、count(主键id)、count(字段)和count(1)等不同用法性能,有哪些差别?那种效率更高

from t这样查询语句里面,count(*)、count(主键id)、count(字段)和count(1)等不同用法性能,有哪些差别。...count()是一个聚合函数,对于返回结果集,一行行地判断,如果count函数参数不是NULL,累计值就加1,否则不加。最后返回累计值。...所以,count(*)、count(主键id)和count(1) 都表示返回满足条件结果集总行数;而count(字段),则表示返回满足条件数据行里面,参数“字段”不为NULL总个数。...对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行id值都取出来,返回给server层。server层拿到id后,判断是不可能为空,就按行累加。...单看这两个用法差别的话,你能对比出来,count(1)执行得要比count(主键id)快。因为从引擎返回id会涉及到解析数据行,以及拷贝字段值操作。

51920

count(*) count(1)与count(col)区别

(*)函数执行是不同 在MyISAM存储引擎中,count()函数是直接读取数据表保存行记录数并返回,效率很高,但是如果添加了where条件的话,MyISAM表也不能返回得很快。...3、count(字段),非主键字段,这样使用方式最好不要出现,因为它不会走索引。 count(主键ID)比count(1)慢原因?...对于 count(主键 ID) 来说,InnoDB 引擎会遍历主键索引树,把每一行ID值取出来,返回给server层,server层拿到ID后,判断是不可能为空,按行累加加1,最后返回累计值。...对于count(1),InnoDB引擎会扫描主键索引树,但不取值,server层对于返回每一行,按行累计加1,判断不可能为NULL,返回累计值。...从InnoDB引擎层返回ID会涉及到解析数据行、拷贝字段值操作,因此count(主键 ID)执行要比count(1)执行慢。 count(主键id)走主键索引时候效率较count(*)差原因?

4.4K21

案例解析:count(1)、count(*) 与 count(列名) 执行区别

其实不然,count(1)和count(*)都会对全表进行扫描,统计所有记录条数,包括那些为null记录,因此,它们效率可以说是相差无几。...从执行计划来看,count(1)和count()效果是一样。但是在表做过分析之后,count(1)会比count()用时少些(1w以内数据量),不过差不了多少。...如果count(1)是聚索引,id,那肯定是count(1)快。但是差很小。 因为count(),自动会优化指定到那一个字段。...2、count(1) and count(字段) 两者主要区别是 1、count(1) 会统计表中所有的记录数,包含字段为null 记录。...2、count(字段)会统计该字段在表中出现次数,忽略字段为null 情况。即不统计字段为null 记录。

1.1K10

数据库COUNT(*)、COUNT(字段)和COUNT(1)异同

COUNT MySQL官网给出解释是: 1、COUNT(expr) ,返回SELECT语句检索行中expr值不为NULL数量。结果是一个BIGINT值。...2、如果查询结果没有命中任何记录,则返回0 3、但是,值得注意是,COUNT(*) 统计结果中,会包含值为NULL行数。...例如: create table #bla(id int,age int) insert #student values(null,null) insert #student values(1,null...(*),count(id),count(id2)查询结果如下: select count(*),count(id),count(age) from #student results 7 3 2 COUNT...MyISAM做了一个简单优化,那就是它可以把表总行数单独记录下来,如果从一张表中使用COUNT(*)进行查询时候,可以直接返回这个记录下来数值就可以了,当然,前提是不能有where条件。

1.8K30

Select count(*)、Count(1)、Count(0)区别和执行效率比较

结论 https://www.cnblogs.com/sueris/p/6650301.html 这里把上面实验结果总结一下: count()和count(1)执行效率是完全一样。...count()执行效率比count(col)高,因此可以用count()时候就不要去用count(col)。...如果是对特定列做count的话建立这个列非聚集索引能对count有很大帮助。 如果经常count()的话则可以找一个最小col建立非聚集索引以避免全表扫描而影响整体性能。...在不加WHERE限制条件情况下,COUNT()与COUNT(COL)基本可以认为是等价; 但是在有WHERE限制条件情况下,COUNT()会比COUNT(COL)快非常多; count(0)=...count(1)=count(*) count(指定有效值)--执行计划都会转化为count(*) 如果指定是列名,会判断是否有null,null不计算 当然,在建立优化count索引之前一定要考虑新建立索引会不会对别的查询有影响

93620
领券