MySQL count(*)总结

来源:互联网 发布:数据库第七章答案 编辑:程序博客网 时间:2024/04/29 08:56

对于myisam存储引擎,使用count(*)会非常迅速,因为其存储引擎不支持行级锁,所以维护一个总条数的代价较小,其在存储引擎内部存储了总行数这个值,所以很容易就得出count(*)

对于innodb存储引擎,因为支持行级锁,一张表会有多个事务进行并发修改操作,每个事务都会影响总行数,所以为了不影响并发性,其存储引擎内部并没有维护这个总行数,自然count(*)需要遍历表中的每个记录来得出,所以特别慢


但是,myisam的count(*)非常快速返回,是有前提条件的,就是不可以带where条件查询,否则它一样需要走全表扫描,性能跟innodb的效果是一样的


另外,count(1)的性能和count(*)的性能是一样的,mysql的优化器会自动对count(*)进行优化,甚至是对count(1)也优化成count(*)的形式,而不会像一般我们想象的那样,将count(*)中的*展开成各个列


最后,count(*)和count(col)是不一样的,count(*)返回表中所有记录的总行数,而count(col)是返回表中col列的值不为NULL的总行数

0 0