MySQL优化COUNT()查询

COUNT()聚合函数,以及如何优化使用了该函数的查询,很可能是最容易被人们误解的知识点之一

COUNT()的作用

COUNT()是一个特殊的函数,有两种非常不同的作用:

  1. 统计某个列值的数量
  2. 统计行数

统计列值

在统计列值时,要求列值是非空的,即不统计NULL。如果在COUNT()的括号中指定了列或者列的表达式,则统计的就是这个表达式有值的结果数。

统计结果集的行数

当MySQL确认括号内的表达式的值不可能为空时,实际上就是在统计行数,最简单的就是当我们使用COUNT(*)的时候,这种情况下通配符 * 并不会像我们猜想的那样拓展成所有的列,实际上,它会忽略所有的列而直接统计所有的行数。

因此会有一个常见的错误就是,在括号内指定了一个列却希望统计结果集的行数。如果希望知道的是结果集的行数,那么最好使用COUNT(*)。这样写意义清晰,性能也会更好。

关于MyISAM的神话

一个很容易产生的误解就是:MyISAM的COUONT()函数总是非常快的,但其实这是有一个前提条件的,即只有没有任何WHERE条件的COUNT(*)才非常快,因为此时无需实际地计算表的行数。MySQL可以利用存储引擎的特性直接获得这个值。

当统计带有WHERE子句的结果集行数时,可以是统计某个列值的数量时,MyISAM的COUNT()和其他存储引擎没有任何不同,也就不再是神话般的速度了。

简单的优化

有时候我们可以使用MyISAM在 COUNT(*) 全表非常快的这个特性,来加速一些特定条件的 COUNT() 查询。比如:

SELECT COUNT(*) FROM world.City WHERE ID > 5;

该查询查找所有ID大于5的城市,这需要扫描4097行数据。但是如果我们把条件反转一下,查找ID小于等于5的城市的数量,然后用总城市的数量一减就可以得到同样的结果,但是却可以把扫描的行数控制在5行以内:

SELECT (SELECT COUNT(*) FROM world.City) - COUNT(*)
FROM world.City WHERE ID <= 5;

使用近似值

有些时候并不需要完全精确的COUNT的值,此时可以用近似值来代替。EXPLAIN出来的优化器估算的行数就是一个不错的近似值,执行EXPLAIN并不需要真正去执行查询,所以成本很低。

原文地址:https://www.cnblogs.com/AmosH/p/10266072.html

时间: 2024-10-23 02:04:43

MySQL优化COUNT()查询的相关文章

MySQL优化之——查询

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46580589 MySQL中select的基本语法形式 select 属性列表 from 表名和视图列表 [where 条件表达式] [group by 属性名[having 条件表达式]] [order by 属性名[asc|desc]] [limit <offset>,row count] 说明: where子句:按照"条件表达式"指定的条件进行查询. g

mysql优化 慢查询(一)

1.显示慢查询的一些参数的命令:show variables like '%slow%';结果如图 2.上面四个参数的意思是: log_slow_queries  off    表示“慢查询”是“关闭的状态” slow_launch_time  2     表示“查询时间超过2秒就记录到慢查询日志中”: slow_queries_log  off   表示慢查询日志开关是关着的 slow_query_log_file "路径"   表示慢查询日志存放完整路径 3.开启慢查询的功能 使用

MySql优化子查询

用子查询语句来影响子查询中产生结果rows的数量和顺序. For example: SELECT * FROM t1 WHERE t1.column1 IN (SELECT column1 FROM t2 ORDER BY column1); SELECT * FROM t1 WHERE t1.column1 IN (SELECT DISTINCT column1 FROM t2); SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 LIMIT 1)

我必须得告诉大家的MySQL优化原理

---恢复内容开始--- 说起MySQL的查询优化,相信大家收藏了一堆奇淫技巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必.因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用. MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展

万字总结:学习MySQL优化原理(转)

本文转自:https://www.tuicool.com/wx/2eMBfmq 前言 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必.因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用. MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间

mysql优化原理,一定要看懂

转:     https://www.jianshu.com/p/d7665192aaaf 我必须得告诉大家的MySQL优化原理 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必.因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用. MySQL逻辑架构

一文说尽 MySQL 优化原理

说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必.因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用. MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展示了MySQL的逻辑架构图

万字总结:学习MySQL优化原理,这一篇就够了!

前言 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必.因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用. MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展示了MySQL的逻辑

关于MYSQL优化 看我这篇就够啦

前言 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必.因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用. MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展示了MySQL的逻辑