mysql innodb count(*)速度慢且不准确的解决办法

innodb引擎在统计方面和myisam是不同的,Myisam内置了一个计数器,所以在使用 select count(*) from table 的时候,直接可以从计数器中取出数据。而innodb必须全表扫描一次方能得到总的数量。要初步解决这个问题,需要做不同于myisam的一些工作:

1、使用第二索引(一般不使用主键索引),并且添加where条件,如:

复制代码 代码如下:

select count(*) from product where comp_id>=0 ;
show index from product ;
id primary key
comp_id index



2、如果只需要粗略统计的话也可使用

show status from product; 来得到大约值
这种方法可在数据分页中使用!

3、使用外部计数器,比如建立一个触发器来计数或者在程序上使用缓存方式定时计数,缺陷是这些方法会额外消耗一些资源!

 

 

 

===========================

   我们知道当mysql采用InnoDB时,count表的记录数随时都会发生变化,特别是在delete和insert比较频繁的时候,这个问题以前注 意过,但由于很长时间没关注,忘了,今天特别在服务器上测试了一下,每次count时都会出现一个很离谱的统计数(select count(*) from user)

解决方法有一下几种,欢迎补充:
1、通过统计全表记录数时在where后面加一个有索引的字段作为条件来查询全表数据,如:select count(tid) from posts where tid>0;  tid不为主键,tid有索引

2、采用InnoDB的表插入数据,不删除,删除数据通过一个字段来标识,isDel=1表示删除0表示正常,这样select count(*) from posts 的数据相对准确一些

3、通过计数器来记录表的数据总行数,添加是增1,删除时减1;这样获取表记录数是最快的,而且是最复杂的

转载于:https://www.cnblogs.com/lbnnbs/p/4785128.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值