新开两个线程, 分别获取两个数据库连接(mysql connector c++), 然后分别执行sql语句select SQL_NO_CACHE  count(*) from tb_testSQL_NO_CACHE 主要是为了测试时间,不使用查询缓存, 现在问题是:
单个线程执行这条语句, 消耗时间为11s左右, 如果两个线程同时执行这条语句, 消耗时间为1分钟左右, 求解惑. 谢谢
tg_test有数据800万条记录.

解决方案 »

  1.   


    计算记录的条数,是在这样的,首先把表的数据加载到内存,然后在内存中扫描 记录的条数。如果记录已经在内存中,那么速度就能更快,因为从硬盘加载数据到内存这个是比较慢的。你现在的问题是 为什么同时运行2个线程,速度就降下来了?如果是服务器,应该不会这样的,如果是普通pc上面本来就运行着各种程序,而 这个 计算条数也是个消耗cpu的操作,会在内存中一个一个的遍历数据块,然后遍历每个数据块中的每条记录。你可以监控一下cpu使用率是否有明显的提高,如果cpu使用率较高,那么说明是机器的问题。
      

  2.   


    你的表是innodb引擎吧,如果要统计记录条数,建议在表中设置一个索引,这样就可以直接扫描索引,速度会很快。
      

  3.   


    另外,你试试通过命令行登录到mysql,然后分别登录2个客户端,运行一下语句,看看需要多久返回。我试了一下,在有索引的情况下,只需要1秒 ,数据量是647万条:mysql> select SQL_NO_CACHE count(*) from tb;
    +----------+
    | count(*) |
    +----------+
    |  6479872 |
    +----------+
    1 row in set (0.93 sec)
      

  4.   


    非常感谢你的解答, 我观察过了, 不是其他程序占用cpu的, 在查询的时候cpu无明显变化,  tb_test表里面有一个主键id.关于你下次测试的那条语句, 是不是之前有查询过而没有添加SQL_NO_CACHE ? , 否则不可能那么快的
      

  5.   


    重启一下mysql, 再次执行  select SQL_NO_CACHE count(*) from tb; 应该就不是这个数值了 0.93sec
      

  6.   


    重启一下mysql, 再次执行  select SQL_NO_CACHE count(*) from tb; 应该就不是这个数值了 0.93sec我重启了服务器,然后执行了:
    mysql> select SQL_NO_CACHE COUNT(*) FROM TB;
    +----------+
    | COUNT(*) |
    +----------+
    |  6479872 |
    +----------+
    1 row in set (1.67 sec)
      

  7.   


    非常感谢你的解答, 我观察过了, 不是其他程序占用cpu的, 在查询的时候cpu无明显变化,  tb_test表里面有一个主键id.关于你下次测试的那条语句, 是不是之前有查询过而没有添加SQL_NO_CACHE ? , 否则不可能那么快的另外,我的机器是普通的pc,I5的cpu,内存4G,但实际上mysql只用了不到600M的内存作为缓冲池 :mysql> show variables like 'innodb_buffer_pool_size%';
    +-------------------------+-----------+
    | Variable_name           | Value     |
    +-------------------------+-----------+
    | innodb_buffer_pool_size | 601882624 |
    +-------------------------+-----------+
    1 row in set (0.01 sec)mysql> select 601882624 / 1024/1024;
    +-----------------------+
    | 601882624 / 1024/1024 |
    +-----------------------+
    |          574.00000000 |
    +-----------------------+
    1 row in set (0.06 sec)
      

  8.   

    有人说count(*)需要用到表级锁, 请问下怎么检查锁是否有冲突?
      

  9.   


    重启一下mysql, 再次执行  select SQL_NO_CACHE count(*) from tb; 应该就不是这个数值了 0.93sec我重启了服务器,然后执行了:
    mysql> select SQL_NO_CACHE COUNT(*) FROM TB;
    +----------+
    | COUNT(*) |
    +----------+
    |  6479872 |
    +----------+
    1 row in set (1.67 sec)

    你确定你的表是innodb引擎?
      

  10.   


    重启一下mysql, 再次执行  select SQL_NO_CACHE count(*) from tb; 应该就不是这个数值了 0.93sec我重启了服务器,然后执行了:
    mysql> select SQL_NO_CACHE COUNT(*) FROM TB;
    +----------+
    | COUNT(*) |
    +----------+
    |  6479872 |
    +----------+
    1 row in set (1.67 sec)

    你确定你的表是innodb引擎?嗯 对的,是innodb,如果是myisam只需要 0.02 秒,因为myisam中会存储 表的记录数,所以速度更快,不会需要1秒才返回的。
      

  11.   


    你可以在其他字段建个索引,这样就只需要访问这个索引,而不需要访问所有的数据,就可以了,而且速度也更快。
    有在其他列建立了索引, 但是结果一样, 为什么 的速度快呢....我以为你的表没有索引呢因为索引的大小,远小于表的大小,而count(*)肯定是一个扫描的操作,那么扫描索引 就要比 扫描表,来的更快。