zoukankan      html  css  js  c++  java
  • 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;这样获取表记录数是最快的,而且是最复杂的

  • 相关阅读:
    Region-Based Segmentation
    不同特征值对应的特征向量
    Edge Linking
    Canny Edge Detector
    度量与非度量方法
    Edge detection using LoG
    Sobel算子
    Edge Model
    Laplacian算子
    图像处理中的一阶导数与二阶导数
  • 原文地址:https://www.cnblogs.com/lbnnbs/p/4785128.html
Copyright © 2011-2022 走看看