工作中经常需要用count函数查询一个表的行数,那count是怎么工作的呢?
MyIsam引擎是把表的行数记录了起来,查询全部的时候直接返回,但是如果加上条件的话就也只能逐行计数了。
Innodb因为使用MVCC支持事务,所以不同的事务看到的行数可能是不一样的,所以不能弄一个全局计数,必须根据每个事务的具体情况去扫描计数。
关于count() count(1) count(主键) count(字段)
count(主键) 是把遍历整张表,把每一行的主键值返回给server层,server层进行计数。
count(1) 是遍历整张表,不取值,server层对返回的每一行放一个1进去,累计计数。
count(字段) 是从每一行中读出字段的值,判断不为null,再进行累加。
count() 是innodb做个优化的,也是遍历表,不取值。
效率:count(*) ≈ count(1) > count(主键) > count(字段)
如果对于需要经常计数的表,我们可以自己把行数存起来。
一:使用redis等缓存,但是会出现数据丢失,或数据不一致的问题。
二 :最好使用一个单独的表,插入或删除数据的操作和更新行数的操作放入同一个事务,既能保持数据的持久性,也能保证数据的一致性
