查询MySQL数据库的时候,select * from tablename where id>100000 limit 10;和select * from tablename limit 100000,10;的查询速度有很大的区别,好几倍的差距,这样在大量数据的时候会很慢,但是一张表里面的记录会被删除,所以用第一种语句就会出现误差,因为第一种是按id的值来查,第二种是按第几条记录来查,但是第二种太慢了,分页能分好几秒的,所以请教一下有没有比较折中的办法!拜谢。

解决方案 »

  1.   

    select * from tablename limit 100000,10
    这种实际上数据库是要遍历100010条记录的,当然慢了,做什么键值都没有用。要么你自己维护id分页记录,自己记录正确的第100000条记录的ID。要么你就尽可能的避免实现这样的功能。
      

  2.   

    LZ 的MYSQL数据库的表类型是不是INNODB
    更改表类型为MYISAM要快好多,我以前测试过的
      

  3.   

    改表类型语句
    alter table equip_article type=MyISAM
    lz试试!
      

  4.   

    不好意思,这几天忙,没来上,我刚刚试了试,我在30W数据的时候分页查询尾页时本来要1.4X秒的,现在已经到了1.0X秒了。虽然0.4秒没有多少,但是相对来说也算多啦。。谢谢这位jim了。。额。。我也是只有思路,没有代码,没有理论。真够郁闷
      

  5.   

    http://faq.csdn.net/read/216314.html  类似的问题,可能对你有帮助
      

  6.   

    同意.
    select * from tablename where id>100000 limit 10;#这个当然快,使用了索引id.这种情况,平衡树查找,可别表扫描快多了.迅速找到>10000的节点起始点,顺序取10条
    select * from tablename where limit 100000,10;#至少扫描100010条记录,所以慢.
      

  7.   

    额,那我那sql语句该怎么写?因为那个ID不是完全固定的啊,中间可能还被删掉一些的。。所以用ID来当做分页的标准会有误差的,也许可以在什么地方去查询上一页的最后一条记录的ID
      

  8.   

    你首选就是禁止此功能。比如翻页只能翻前10页之类。如果你清楚索引原理就知道,数据库是没有办法做到优化limit翻到极后面的页的速度的。如果所有的数据都有可能被查询。那么折中的办法就是分表。象csdn就是这样做的。半年前的贴子被移到了别的表里,搜索时要指定时间区间。多长时间分一次表根据你实际数据增长速度而定。另一种办法就是缓存。第一次读取时比较慢,然后把读出来的第一条id写入到一个专门的表里。以后再翻到这页时从缓存表中读取起始id。当然如果添删数据,比修改过的id大的后面的所有页的缓存就得作废。
      

  9.   


    根据不同应用可以有很多种优化方案
    例如做目录,在千万级数量以下
    可以定时重建 INDEX, 加入一个新字段或表
    生成顺序id, 查询时使用这个新id就很快了所以用途不同,优化方法分别很大