目前要求就是统计任意一个SQL的结果集总数。要求效率最好的。
我现在是用mysql_num_rows,除了使用方便外,执行效率真不好。
还有就是count,有条件的时候count(*)好像也不太好使了。
不知能用什么方法了。
sql不固定、是任意的。***************************** `ip` 存储引擎 InnoDB *****************************SQL: 
SELECT * FROM `ip` where ipid > 1400
用PHP的mysql_num_rows()统计。
用时:
1138446 / 4.77450秒
SQL: 
SELECT count(*) FROM `ip` where ipid > 1400
用时:
Array ( [count(*)] => 1138446 ) 2.300020秒
SQL: 
SELECT count(*) FROM `ip`
用时:
Array ( [count(*)] => 1139704 ) 2.390520秒***************************** `ip1` 存储引擎 MyISAM *****************************
SQL: 
SELECT * FROM `ip1` where ipid > 1400
用PHP的mysql_num_rows()统计。
用时:
1138446 / 2.026050秒
SQL: 
SELECT count(*) FROM `ip1` where ipid > 1400
用时:
Array ( [count(*)] => 1138446 ) 0.564690秒
SQL: 
SELECT count(*) FROM `ip1`
用时:
Array ( [count(*)] => 1139704 ) 0.000220秒

解决方案 »

  1.   

    在IPID上建立索引没有
    具体什么问题
      

  2.   

    IPID有索引。主键来的。目前要求就是统计任意一个SQL的结果集总数。要求效率最好的。
      

  3.   

    如果是类似
    SELECT * FROM ... WHERE ...

    SELECT FOUND_ROWS()即可得到行数
      

  4.   


    这个并没有好办法,如果是任意的查询,则无法利用索引,只能通过全表扫描来得到结果集进行统计。
    但总体上 select count(*) 要优于 mysql_num_rows, 因为这个至少不需要返回这么大的结果集。直接由MYSQL进行统计。
      

  5.   

    SELECT FOUND_ROWS()得在查询的sql上面加上
    SQL_CALC_FOUND_ROWS 问题一。问题二。加上贼慢了。
    查询
    SELECT SQL_CALC_FOUND_ROWS  * FROM `item_sell_20110823` WHERE num_iid > 1000 LIMIT 10
    查询花费 2.74143秒。不加SQL_CALC_FOUND_ROWS 0.00048秒。 SELECT FOUND_ROWS()
    Array ( [FOUND_ROWS()] => 897546 )
    行不通。
      

  6.   

    SELECT count(*) FROM `ip`
    用时:
    Array ( [count(*)] => 1139704 ) 2.390520秒像这个的话。还需2秒。2秒极限了? 没别的方法了啊。。
      

  7.   

    各位还有什么方案不。我是开发一mysql管理系统的。
    sql是无限制查询啊。。所以任意的。需要得获sql查询得到结果的总记录数。数据量大的时候就不好了。这问题得解决........
      

  8.   

    从MYSQL角度来说,已经是极限了,除非是调整参数,添加内存,提高硬件。
      

  9.   

    哦。硬件一定提高不了。开源提供别人使用的。总不能让别人买台牛机器啊。
    如果不考虑其它因素、每limit几十条数据就得花费2、3秒。实在让人受不了。还有像下面那个MyISAM表。
    SQL: 
    SELECT count(*) FROM `ip1` where ipid > 1400
    用时:
    Array ( [count(*)] => 1138446 ) 0.564690秒
    SQL: 
    SELECT count(*) FROM `ip1`
    用时:
    Array ( [count(*)] => 1139704 ) 0.000220秒
    这是为何呐? 相差这么大。
      

  10.   

    至少2、3秒了。where 就一个id还是索引来的。
      

  11.   


    MYISAM表当直接SELECT COUNT(*)不做任何WHERE时,MYSQL直接从数据字典取该表的记录总数。
      

  12.   

    select count(ipid) from .... WHERE
    速度如何
      

  13.   

    SELECT count(ipid) FROM `ip` where ipid > 1400    // InnoDB 
    Array ( [count(ipid)] => 1138446 ) 2.407130SELECT count(ipid) FROM `ip1` where ipid > 1400  // MyISAM 
    Array ( [count(ipid)] => 1138446 ) 0.571370
    一样啊。测试结果还比1楼的慢点点.....
      

  14.   

    你的表有多少个字段,
    测试了一下,在大约10万条的表,引擎INNODB,执行
    SELECT SQL_NO_CACHE COUNT(*) FROM TMP WHERE F1>='123'
    只要0.007秒,在F1上有索引
      

  15.   

    假设在num_iid上有索引,下述SQL语句速度如何
    sELECT SQL_CALC_FOUND_ROWS * FROM `item_sell_20110823` WHERE num_iid > 1000 LIMIT 10->select a.* from `item_sell_20110823` a inner join
    (select num_iid  from `item_sell_20110823` WHERE num_iid > 1000 LIMIT 10 ) b
    on a.num_iid=b.num_iid
      

  16.   

    InnoDB ****************************************************mysql> SELECT count(*) FROM `ip`;
    +----------+
    | count(*) |
    +----------+
    |  1139704 |
    +----------+
    1 row in set (2.22 sec)
    MyISAM  ****************************************************
    mysql> SELECT SQL_NO_CACHE  count(*) FROM `ip1` where ipid > 1400
        -> ;
    +----------+
    | count(*) |
    +----------+
    |  1138446 |
    +----------+
    1 row in set (0.56 sec)mysql> SELECT count(*) FROM `ip2`;
    +----------+
    | count(*) |
    +----------+
    |   379901 |
    +----------+
    1 row in set (0.00 sec)mysql> SELECT count(*) FROM `ip2` WHERE ipid > 1400;
    +----------+
    | count(*) |
    +----------+
    |   378643 |
    +----------+
    1 row in set (0.24 sec)mysql>
    测了一个30多万的还是MyISAM。 0.24 sec
      

  17.   

    sELECT SQL_CALC_FOUND_ROWS * FROM `item_sell_20110823` WHERE num_iid > 1000 LIMIT 10
    这个昨晚有测了。要2秒多。不加SQL_CALC_FOUND_ROWS 0.00048秒。select a.* from `item_sell_20110823` a inner join
    (select num_iid from `item_sell_20110823` WHERE num_iid > 1000 LIMIT 10 ) b
    on a.num_iid=b.num_iid
    这个你干啥子哦。这表不在公司。测不了。
      

  18.   

    刚跑去phpmyadmin看了一下。~1,138,6231数据一点就打开了。没点儿延时。应该不是用count(*)来统计。 
    不知怎么做的。
      

  19.   

    select a.* from `item_sell_20110823` a inner join
    (select num_iid from `item_sell_20110823` WHERE num_iid > 1000 LIMIT 10 ) b
    on a.num_iid=b.num_iid
    这个你干啥子哦。这表不在公司。测不了。
    替换
    sELECT SQL_CALC_FOUND_ROWS * FROM `item_sell_20110823` WHERE num_iid > 1000 LIMIT 10
    这个语句
      

  20.   

    回在16楼有看你回复的啊。下面说的那表是InnoDB的。1百多万统计查得很快。有些不明就回了。
    原来他是读TABLES.TABLE_ROWS这个字段的。
    InnoDB的统计不准确。InnoDB表有WHERE的SQL,phpmyadmin也是查询得很慢。
    时间主要是花费在统计总数上了。
      

  21.   

    count(*) 是效率高的了 
      

  22.   

    都喜欢count(*)  呢,怎么不用诸如 count(1) 这样的呢?
    难怪 教科书上例子都是 *
    动不动就 * 
      

  23.   

    不要轻易就下这种结论。如果这位有兴趣,不妨测试一下 select count(*) 与 select count(1) 哪个快。 实践是检验的标准。 
      

  24.   

    有测过count(*) 比 count(1) 快。
      

  25.   

    如果你不需要非常精确的数字,可以用EXPLAIN SELECT * FROM TBNAME WHERE ID>4000;得到记录集里去取ROWS字段。如果需要精确数字,可以在执行EXPLAIN前,先ALTER TABLE TBNAME ENGINE=MYISAM。这样就比较准。
      

  26.   

    是要精确的。InnoDB的EXPLAIN不准确
    如果先这么弄的话:ALTER TABLE TBNAME ENGINE=MYISAM 就只这个花费时间就多于count(*)时间了。