`

SELECT COUNT使用优化

阅读更多
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
分享到:
评论

相关推荐

    分析MySQL中优化distinct的技巧

    MySQL的执行计划显示,原始SQL语句`SELECT COUNT(DISTINCT nick) FROM user_access`使用了`ind_user_access`索引进行全扫描,这意味着数据库需要遍历整个索引来获取不重复的`nick`值。这显然是低效的,因为即使使用...

    mysql技巧之select count的区别分析

    1.测试环境 OS:LinuxDB:mysql-5.5.18table:innodb存储引擎 表定义如下: 2. 测试场景与分析【统计表group_message的... 通过上述测试结果可以看到,select count(*)和select count(1)都使用了group_id这个最短

    select count()和select count(1)的区别和执行方式讲解

    往常我经常会看到一些所谓的优化建议不使用Count(* )而是使用Count(1),从而可以提升性能,给出的理由是Count( *)会带来全表扫描。而实际上如何写Count并没有区别。 Count(1)和Count(*)实际上的意思是,评估Count...

    sql server中Select count(*)和Count(1)的区别和执行方式

    如果表中存在非NULL的索引列,优化器可能会选择使用这个索引来计算`COUNT(*)`,因为它可以更快地得到结果,而无需遍历整个表。例如,如果有一个NOT NULL的单列索引,优化器可能会优先选择这个索引来提高查询性能。 ...

    mysql SELECT FOUND_ROWS()与COUNT()用法区别1

    在MySQL数据库中,`SELECT FOUND_ROWS()` 和 `COUNT(*)` 都是用来获取数据表中记录数量的方法,但它们之间存在一些关键的区别。了解这些差异对于优化查询性能和满足特定需求至关重要。 首先,`COUNT(*)` 是一个标准...

    关于mysql中innodb的count优化问题分享

    采用 代码如下:select count(*) from table where id >=0;或select count(*) from table;效果是一样的,都是默认使用pk索引,且都要全表扫描,虽然第一种性能可能高一些,但是没有明显区别。 但是如果用secondary ...

    Select count(*)、Count(1)和Count(列)的区别及执行方式

    实际上,SQL Server的查询优化器会根据表结构和索引来决定最高效的计数方法,无论使用 `COUNT(*)` 还是 `COUNT(1)`。当执行 `COUNT(*)` 时,优化器会寻找最窄的非NULL列来计算行数,如果该列有索引,那么会利用这个...

    SQL 的 SELECT 语句优化

    13. **使用EXISTS替代COUNT**:当只需要检查表中是否存在满足条件的记录时,使用EXISTS通常比COUNT更快,因为它在找到第一个匹配项后就会停止。 以上这些优化技巧可以帮助你编写出更高效的SQL SELECT语句,减少...

    为什么 select count(*) from t,在 InnoDB 引擎中比 MyISAM 慢?

    在MySQL数据库中,`select count(*) from t` 这样的SQL语句用于计算表`t`中的行数。然而,根据不同的存储引擎,如InnoDB和MyISAM,这个操作的性能差异显著。这个问题是理解数据库优化的一个关键点,特别是在处理大...

    MySQL数据库优化SQL篇PPT课件.pptx

    从执行计划、SELECT语句、IN和EXIST语句、LIMIT语句、RAND函数、Order by、Group by、Distinct和Count等方面对MySQL数据库优化进行了详细的讲解。 一、执行计划 执行计划是MySQL数据库优化的重要步骤。执行计划...

    MySQL中distinct和count(*)的使用方法比较

    `COUNT(*)` 的使用需要注意,如果没有 `WHERE` 条件,使用 `COUNT(*)` 通常比 `COUNT(DISTINCT column)` 快,因为后者需要处理重复值。然而,如果仅关心特定列的不重复值数量,那么 `COUNT(DISTINCT column)` 是必要...

    从一个select到另一个select

    SELECT Customers.CustomerName, COUNT(Orders.OrderID) AS TotalOrders FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID GROUP BY Customers.CustomerName ``` 在这个例子中,我们...

    mysql进阶优化

    SELECT COUNT(*) FROM T GROUP BY column_name HAVING COUNT(*) > 1; ``` **注意:** - 如果聚合函数如COUNT()等出现在WHERE子句中,可能会导致错误的结果或全表扫描。 - HAVING子句只能用于分组后的结果集,而...

    DB2 优化,db2性能优化,查询优化

    - **高效检查表中行的存在性**:使用`SELECT INTO`或游标技术来检测特定条件下的行存在性,避免使用`SELECT COUNT(*)`除非表非常小。 - 不推荐做法:`SELECT COUNT(*) FROM TABLENAME` - **适当使用索引**:对于...

    Oracle SQL性能优化技巧总结

    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, ...

Global site tag (gtag.js) - Google Analytics