MYSQL优化之COUNT()聚合函数

MYSQL优化之COUNT()聚合函数

COUNT( )聚合函数,以及如何优化使用了改函数得查询,很可能是MYSQL中最容易被误解得是个话题之一,在网上随便搜索一下就能看到各种各样得理解,在聊怎么优化之前,先来看一下COUNT( )函数真正得作用是什么?

COUNT()介绍

  • COUNT( ) 是一个特殊得聚合函数,有两种不同得作用:
  1. 统计某个列值得数量,在统计列值得数量时要求列值非空(非NULL),使用方法:

    SELECT COUNT(COL) FROM TABLE

  2. 统计表行数,使用方法:

    SELECT COUNT(*) FROM TABLESELECT COUNT(1) FROM TABLE

INNODB使用推荐

结果集要求查询行数,最好使用COUNT(*)。这样写意义清晰,性能也会更好

MYISAM使用推荐

  • MYISAM存储引擎与COUNT( )的爱与恨:

关于MYISAM得神话,COUNT( )是非常高效的,前提时没有任何WHERE条件,MYSQL可以利用存储引擎的特性直接获取这个值。
注:如果MYSQL知道某列COL不可能为NULL值,那么MYSQL内部会直接将COUNT(COL)表达式转化成COUNT()。*

MYISAM存储引擎简单优化:

有时候可以使用MYISAM在COUNT(*)全表非常快的这个特性,来加速一些特定条件的COUNT( )查询。在下面的例子中,看如何优化这个SQL。

MYSQL> SELECT COUNT(*) FROM TABLE WHERE ID>5;

通过SHOW STATU的结果可以看到该查询需要扫描4097行数据,如果将条件反转一下,先查找ID小于5的结果,然后用总数一减,就能得到同样的结果

MYSQL>SELECT  (SELECT COUNT() FROM TABLE)-COUNT() FROM  TABLE WHERE ID<=5;

这样就可以大大减少扫描的行数

COUNT( )其他用法:

  • 在同一个查询中,统计一个列不同值的数量
  1. 利用SUM计算不同值得数:
 MYSQL>SELECT SUM(IF(COLOR='BLUE',1,0)) AS BLUE,SUM(IF(COLOR='BLACK',1,0)) AS BLACK FROM TABLE;
  1. 利用COUNT()不统计为NULL得特性来查询:
MYSQL>SELECT COUNT(COLOR='BLUE' OR NULL) AS BLUE,COUNT(COLOR='BLACK' OR NULL) AS BLACK FROM TABLE;
  1. 最简单统计数量方法:
MYSQL>SELECT COUNT(COLOR='BLUE') AS BLUE,COUNT(COLOR='BLACK') AS BLACK FROM TABLE;

使用近似值EXPLAIN

  • 在某些业务场景不需要精确得COUNT值时,此时可以用近似值来代替,EXPLAIN优化器估算的行数就是一个不错的选择:
EXPLAIN SELECT * FROM TABLE

本文内容摘抄于高性能MYSQL3版 236页

你可能感兴趣的:(mysql,mysql,优化,count)