- 浏览: 74735 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
SQL 语句的COUNT有两种用途
1. 用来计算行数——Count(*)
2. 用来计算某个值的数量——COUNT(col1)
Count(*) 永远返回的都是结果集中的行数,而COUNT(col1)只返回col1值非空的记录数,如果col1值全部非空,
Count(*)和COUNT(col1)的结果是相同的。
Count的用法很简单,可在实际开发过程中还是能找到使用不那么精确的地方
很多时候我们会利用Count(*)来检查是否存在满足条件的数据,例如删除一个用户角色的时候,会通过
/****************************************************************************************************/
select count(*) from tbl_user_role user_role where user_role.role_id=#roldId#
/****************************************************************************************************/
来判断是否用户角色是否因被某个用户引用而不能删除。其实,我们的业务只要求确认是否有满足的条件的记录存在,而根本不关心满足记录的数量。select count(*)在这个例子中的用法会导致不必要的磁盘扫描和记录检索。正确的写法应该是
/*************************************Mysql***************************************************************************/
select exists (select * from tbl_user_role user_role where user_role.role_id=10 limit 1)
/*************************************Mysql***************************************************************************/
/*************************************Oracle***************************************************************************/
select count(*) from dual where exists (select * from tbl_user_role user_role where user_role.role_id=10 and rownum=1)
/*************************************Oracle***************************************************************************/
写法可能有多种,原理很简单,就是只找到符合记录的第一条就终止查询。
参考资料
Exists Vs. Count(*) - The battle never ends
A common problem when optimizing COUNT()
The dangerous subtleties of LEFT JOIN and COUNT() in SQL
1. 用来计算行数——Count(*)
2. 用来计算某个值的数量——COUNT(col1)
Count(*) 永远返回的都是结果集中的行数,而COUNT(col1)只返回col1值非空的记录数,如果col1值全部非空,
Count(*)和COUNT(col1)的结果是相同的。
Count的用法很简单,可在实际开发过程中还是能找到使用不那么精确的地方
很多时候我们会利用Count(*)来检查是否存在满足条件的数据,例如删除一个用户角色的时候,会通过
/****************************************************************************************************/
select count(*) from tbl_user_role user_role where user_role.role_id=#roldId#
/****************************************************************************************************/
来判断是否用户角色是否因被某个用户引用而不能删除。其实,我们的业务只要求确认是否有满足的条件的记录存在,而根本不关心满足记录的数量。select count(*)在这个例子中的用法会导致不必要的磁盘扫描和记录检索。正确的写法应该是
/*************************************Mysql***************************************************************************/
select exists (select * from tbl_user_role user_role where user_role.role_id=10 limit 1)
/*************************************Mysql***************************************************************************/
/*************************************Oracle***************************************************************************/
select count(*) from dual where exists (select * from tbl_user_role user_role where user_role.role_id=10 and rownum=1)
/*************************************Oracle***************************************************************************/
写法可能有多种,原理很简单,就是只找到符合记录的第一条就终止查询。
参考资料
Exists Vs. Count(*) - The battle never ends
A common problem when optimizing COUNT()
The dangerous subtleties of LEFT JOIN and COUNT() in SQL
发表评论
-
千万级测试数据生成方法【转】
2010-07-13 13:31 2262http://blog.csai.cn/user1/16350 ... -
数据库中使用自增量字段与Guid字段作主键的性能对比
2010-07-13 11:06 1081http://www.cnblogs.com/houleixx ... -
MySQL: MyISAM和InnoDB的区别
2010-07-12 15:58 841InnoDB和MyISAM是在使用MySQL最常用的两个表类型 ... -
利用frofile找新能瓶颈【转】
2010-07-12 15:54 980转自http://www.yqshare.com/mysql- ... -
查看mysql的一些小命令
2010-07-12 15:31 743mysql> \s查看版本信息 -
mysql性能跟踪器
2010-07-12 15:24 939MYSQL5.0家族提供的性能跟踪器确实很爽。 要注意两点。 ... -
MySQL数据库优化脚本Tuning-primer.sh
2010-07-12 15:14 1718很好用的mysql数据库优化脚本,相对mysqltuner.p ... -
mysql在linux下的my.cnf文件在哪里!
2010-07-12 14:01 2207用rpm包安装的MySQL是不会安装/etc/my.cnf文件 ... -
MySQL密码丢失的找回方法(win/*inx)
2010-07-12 11:43 767破解本地密码: Windows: 1.用系统管理员登陆系统。 ... -
MySQL数据的导出和导入工具
2010-07-12 11:11 618导出要用到MySQL的mysqldump工具,基本用法是: ... -
MySQL慢查询分析mysqldumpslow
2010-07-12 11:08 1706一直以来积累了很多对MySQL优化的心得和经验,计划通过写日志 ... -
打开MySQL的慢查询记录
2010-07-12 11:02 707转自http://www.ccvita.com/326.htm ... -
查看MySQL运行状况
2010-07-12 10:48 817列举了几种查看MySQL运行状况的方法,总结一下。 转自htt ... -
什么是mysql的慢查询
2010-07-12 10:31 1392MySQL有一个功能就是可以log下来运行的比较慢的sql语句 ... -
用MYSQLADMIN改用户密码
2010-07-12 09:55 995转自http://yueliangdao0608.blog.5 ... -
Mysql数据导入导出命令
2010-07-07 11:09 726many of us may only need to use ...
相关推荐
MySQL的执行计划显示,原始SQL语句`SELECT COUNT(DISTINCT nick) FROM user_access`使用了`ind_user_access`索引进行全扫描,这意味着数据库需要遍历整个索引来获取不重复的`nick`值。这显然是低效的,因为即使使用...
1.测试环境 OS:LinuxDB:mysql-5.5.18table:innodb存储引擎 表定义如下: 2. 测试场景与分析【统计表group_message的... 通过上述测试结果可以看到,select count(*)和select count(1)都使用了group_id这个最短
往常我经常会看到一些所谓的优化建议不使用Count(* )而是使用Count(1),从而可以提升性能,给出的理由是Count( *)会带来全表扫描。而实际上如何写Count并没有区别。 Count(1)和Count(*)实际上的意思是,评估Count...
如果表中存在非NULL的索引列,优化器可能会选择使用这个索引来计算`COUNT(*)`,因为它可以更快地得到结果,而无需遍历整个表。例如,如果有一个NOT NULL的单列索引,优化器可能会优先选择这个索引来提高查询性能。 ...
在MySQL数据库中,`SELECT FOUND_ROWS()` 和 `COUNT(*)` 都是用来获取数据表中记录数量的方法,但它们之间存在一些关键的区别。了解这些差异对于优化查询性能和满足特定需求至关重要。 首先,`COUNT(*)` 是一个标准...
采用 代码如下:select count(*) from table where id >=0;或select count(*) from table;效果是一样的,都是默认使用pk索引,且都要全表扫描,虽然第一种性能可能高一些,但是没有明显区别。 但是如果用secondary ...
实际上,SQL Server的查询优化器会根据表结构和索引来决定最高效的计数方法,无论使用 `COUNT(*)` 还是 `COUNT(1)`。当执行 `COUNT(*)` 时,优化器会寻找最窄的非NULL列来计算行数,如果该列有索引,那么会利用这个...
13. **使用EXISTS替代COUNT**:当只需要检查表中是否存在满足条件的记录时,使用EXISTS通常比COUNT更快,因为它在找到第一个匹配项后就会停止。 以上这些优化技巧可以帮助你编写出更高效的SQL SELECT语句,减少...
在MySQL数据库中,`select count(*) from t` 这样的SQL语句用于计算表`t`中的行数。然而,根据不同的存储引擎,如InnoDB和MyISAM,这个操作的性能差异显著。这个问题是理解数据库优化的一个关键点,特别是在处理大...
从执行计划、SELECT语句、IN和EXIST语句、LIMIT语句、RAND函数、Order by、Group by、Distinct和Count等方面对MySQL数据库优化进行了详细的讲解。 一、执行计划 执行计划是MySQL数据库优化的重要步骤。执行计划...
`COUNT(*)` 的使用需要注意,如果没有 `WHERE` 条件,使用 `COUNT(*)` 通常比 `COUNT(DISTINCT column)` 快,因为后者需要处理重复值。然而,如果仅关心特定列的不重复值数量,那么 `COUNT(DISTINCT column)` 是必要...
SELECT Customers.CustomerName, COUNT(Orders.OrderID) AS TotalOrders FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID GROUP BY Customers.CustomerName ``` 在这个例子中,我们...
SELECT COUNT(*) FROM T GROUP BY column_name HAVING COUNT(*) > 1; ``` **注意:** - 如果聚合函数如COUNT()等出现在WHERE子句中,可能会导致错误的结果或全表扫描。 - HAVING子句只能用于分组后的结果集,而...
- **高效检查表中行的存在性**:使用`SELECT INTO`或游标技术来检测特定条件下的行存在性,避免使用`SELECT COUNT(*)`除非表非常小。 - 不推荐做法:`SELECT COUNT(*) FROM TABLENAME` - **适当使用索引**:对于...
SELECT COUNT(DECODE(DEPT_NO, 0020, 'X', NULL)) D0020_COUNT, COUNT(DECODE(DEPT_NO, 0030, 'X', NULL)) D0030_COUNT, SUM(DECODE(DEPT_NO, 0020, SAL, NULL)) D0020_SAL, SUM(DECODE(DEPT_NO, 0030, SAL, ...