/*[16:05:03][  31 ms]*/ select * from t limit 100,200
/*[16:05:06][2984 ms]*/ select * from t limit 1999900,2000000
都是100条数据,为什么后面的时间要多花这么多?
表t里面有200万条记录,CREATE TABLE `t` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `String` varchar(24) DEFAULT NULL,
  `datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2000001 DEFAULT CHARSET=gb2312请问:怎么优化可以使2条查询时间差不多?

解决方案 »

  1.   

    select * from t limit order by id 1999900,100
    or
    select * from t order by id desc limit 100,200
      

  2.   

    测试了一下,在建立索引的情况下,83760条记录
    select * from t limit 100,200 10ms
    select * from t order by id desc limit 100,200 20ms
    select * from t limit 82760,200 521ms
      

  3.   

    select * from t order by id limit 82760,100 961ms
      

  4.   

    如果是按ID来编号的话,ID上建立索引,你已经有主键了,不用建立索引,加上
    ORDER BY ID DESC LIMIT .....
      

  5.   

    /*[16:59:26][4390 ms]*/ select * from t  order by id  desc limit 1999900,100
    /*[16:59:29][2781 ms]*/ select * from t  order by id  asc limit 1999900,100
    这2个时间差不了多少的。
      

  6.   

    SELECT a.* FROM t a 
    inner join (SELECT id FROM jzg1 ORDER BY id desc LIMIT 1999900,100
    ) a1
    on a1.id=a.id
    速度应该有提高
      

  7.   

    MYSQL在记录集的开始和最后快,中间的会慢点。所以对于这种操作,更好的用自增字段来实现,或者INT型主键来实现分页!