转:http://blog.csdn.net/ljfrocky/article/details/47208955
关于MyISAM的神话
一个容易产生的误解就是:MyISAM的COUNT()函数总是非常快,不过这是有前提条件的,即只有没有任何where条件的COUNT(*)才非常快,因为此时无需实际地去计算表的行数。MySQL可以利用存储引擎的特性直接获得这个值。如果MySQL知道某列col不可能为NULL值,那么MySQL内部会将COUNT(col)表达式优化为COUNT(*)。
当统计带WHERE子句的结果集行数,可以是统计某个列值的数量时,MySQL的COUNT()和其它存储引擎没有任何不同,就不再有神话般的速度了。所以在MyISAM引擎表上执行COUNT()有时候比别的引擎快,有时候比别的引擎慢,这受很多因素影响,要视具体情况而定。
mysql>SELECT COUNT(*) FROM world.city WHERE ID > 5;
mysql>SELECT (SELECT COUNT(*) FROM world.city) - COUNT(*) FROM world.city WHERE ID <= 5;
mysql> show status like "last_query_cost";
+-----------------+------------+
| Variable_name | Value |
+-----------------+------------+
| Last_query_cost | 453.339769 |
+-----------------+------------+
1 row in set (0.00 sec)