select COUNT 语句深入解释

Select count 只统计不是null的列数,所以count(列名),count(常量),count(*)的区别就是:

count(列名)中的列可能是null,于是不被统计入内

其余两个倒是统计所有符合条件的行数,且是标准的统计行数的方法,mysql已经做了一些优化,所以推荐

COUNT(*)的优化

区分为MyISAM和InnoDB两种引擎的区别。MyISAM是表级锁,且不支持事务,而InnoDB是行级锁,且支持事务。

由于MyISAM是表级锁,不会存在查询的时候并发对表行数的修改,故可以直接调用缓存下的表的行数。

而InnoDB是会在查询的时候,行数发生变化的,不可使用缓存行数。就会涉及查询的时候实时去扫表,InnoDB 8.0.13开始,扫表开始有一些有优化:

count(*)只关心条数,不关心内容,所以会选择低成本的索引扫表。当语句中没有where和group by条件时,InnoDB会使用聚簇索引(主键索引)和非聚簇索引(非主键索引)中的非聚簇索引。聚簇索引的叶子节点保存证行记录,而非聚簇索引只保留该行记录的主键值。所以相比之下,非聚簇索引的成本低很多,MySql会优先选择最小的非聚簇索引来扫表。因此建表的时候,除了主键索引,非主键索引也是很必要的。

以上优化的条件是当查询语句中不存在where 和group by的时候

COUNT(*)和COUNT(1)

MYSQL官方文档是说InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

COUNT(字段)

count(字段)会判断列值是不是null,所以性能会低于count(*)

原文地址:https://www.cnblogs.com/yc5518/p/11712223.html

时间: 2024-08-04 04:50:23

select COUNT 语句深入解释的相关文章

不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤

原文:不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤 数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查. 在数据库的增删改查操作中,使用最频繁的就是查询操作.而在所有查询操作中,统计数量操作更是经常被用到. 关于数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT. 但是,就是这个常用的COUNT函数,却暗藏着很多玄机,尤其是在面试的时候,一不小心就会被虐.不信的话请尝试回答下以

select count(1) from table where ..这句sql语句的作用

作用是计算一共有多少符合条件的行.1并不是表示第一个字段,而是表示一个固定值,count(1)和count(2)效果是一样的 count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些.count(字段值),将返回符合条件的非空数量 1.查询所有数据,列出7列数据 2.使用count(1)查询结果,返回7 3.使用count(*)查询结果,返回7 4.括号中是表中的字段值,count(字段值),返回表中非空的C_Id字段下的数据数量

orcle 11g select count(*) from v$lock 引起的思索

<strong>最近发现orcle 11g select count(*) from v$lock 查询很慢,觉得有必要进行详细的分析::</strong> select count(*) from v$lock; -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%

pl/sql快速输入select等语句

平时对数据库操作的时候,输入DML语句,很浪费时间,我们想要这样的效果 ,输入sf,plsql就会自动输入select * from.我们需要在plsql中进行如下设置即可: 工具(tools)-->首选项(preferences)-->编辑器(editors)-->自动替换(autoreplace)下面的编辑(edit),在弹出的输入框中输入: sf=select * fromsof=select count(*) froms=selectf=fromw=whered=deleteu=

SQL - SELECT COUNT用法

SQL Server数据库 COUNT() 函数返回匹配指定条件的行数. 语法 SQL COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入): SELECT COUNT(column_name) FROM table_nameSQL COUNT(*) 语法 COUNT(*) 函数返回表中的记录数: SELECT COUNT(*) FROM table_nameSQL COUNT(DISTINCT column_name)

select count(1) 和 select count(*)的区别

统计一个表T有多少行数据,通常写法是: 查询A:select count(*) from T 但也可以采用下面语句来查: 查询B:select count(1) from T 结果通常是一样的.那么二者区别在哪里呢? 如果T表是个很大的表,那么查询速度将有显著的差异.实践中T表有4200万行,采用查询B,耗时3分多钟,而采用查询A,则耗时不到1秒.可见在大表的查询上必须非常谨慎. 那么为什么查询A比查询B快呢? 个人分析认为,查询A不需要过滤,直接用末行位置-首行位置/每行占用位置.而查询B,因

MySQL学习笔记(10)之select查询语句

select查询语句 格式: Select 选项 字段列表 from.where like.group by.haring.order by.limit: 字段列表:select * from 表名: Select (字段名) from 表名: 字段部分可参与的运算. Select 字段±数字 from 表名: 1.别名: Select 字段名 as 别名 from 表名: 2.From子句: 查询多个表: select 表1.字段1,表1.字段2...表2.字段1... From 表1,表2:

mysql下的SELECT INTO语句

在mysql下使用SELECT INTO语句会产生ERROR 1327 (42000): Undeclared variable:new_tablename 此时要使用: CREATE TABLE CYRTEMP(SELECT Cno,COUNT(Sno),AVG(Score) FROM CYRReports GROUP BY(Cno)); 来替代原句: SELECT Cno,COUNT(Sno),AVG(Score) INTO SUM_AVGSco FROM CYRReports GROUP

select count(*)和select count(1)哪个性能高

一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的 假如表沒有主键(Primary key), 那么count(1)比count(*)快, 如果有主键的話,那主键作为count的条件时候count(主键)最快 如果你的表只有一个字段的话那count(*)就是最快的 count(*)是什么意思?事实上,它真正的含义是找一个占用空间最小的索引字段,然后对它进行记数,不要一看到*就认为"大",在count命令中,它指的是"任意一个&qu