对于一些引擎,如innodb,由于其不存储表中的行数,因此,select count(*)对于innodb来说,是比较慢的;相比之下,myisam由于其存储表中行数的统计信息,因此select count(*)更加快速
详细讨论见:http://blog.youkuaiyun.com/gtuu0123/archive/2010/04/11/5473045.aspx
可以采用计数表的方式,将一个innodb表的行数写到其他表
http://www.penglixun.com/tech/database/count_table_skill.html文章给出了解决办法
总结如下:
(1)利用触发器,在每次添加和删除记录时,更新记数表
(2)对于记数表的某一行更新很频繁,会造成大量的锁,因此可以将对某一个表的记数的行扩展到多行,每次随机选取一行进行+1和-1操作,这样就把对一行更新的压力分散到了多行
(3)对于条件的count(*),考虑也把相应的条件引入记数表作为一个字段,那么不同的条件,可以建立不同的记数表