比如有:
select * from tbl_1 where type=1 order by datetime asc limit 80000;
我只需要从tbl_1中获取按时间排序后的记录中的最后一行,而不是全部80000行,如果使用fetch一直提取到最后一行,感觉不理想。有变通的办法没?实际的需求是:获取表中符合条件的某一行记录,和他前后10行记录。但定位“表中符合条件的某一行记录”不能通过id直接定位。php中支持直接fetch最后一行的操作吗?效率与从头fetch相比有提高还是一样的?如果使用
select max(datetime) from (select * from tbl_1 where type=1 order by datetime asc limit 80000) tmp;
同样存在结果集很大时,查询效率问题--查询计划中,取max是通过中间结果集获取的,无索引可用,中间结果集越大,问题越突出。

解决方案 »

  1.   

    select * from tbl_1 where type=1 and datetime<1234567 order by datetime dasc limit 80000;
    直接提取第一行?看到手册有mysqli_data_seek可以直接提取最后一行,不知道它的工作效率怎么样。了解的朋友请来说一说。
      

  2.   

    呃,忘了limit可以限定范围,limit 500,500 可以么?
      

  3.   

    你知道499刚好是你要的那名用户?500是加入次序,表里没有,表里有的是datetime,加入时间。加入时间<>加入次序。
      

  4.   

    时间是你用where去判断的,limit只是限制输出select * from tbl_1 where type=1 order by datetime asc limit 80000,80000;我只是把你自己写的那句改了一下前后10条的话作二次,三次查询啰
      

  5.   

    SELECT * FROM tbl_1 WHERE 主键 = (SELECT MAX(主键) FROM tbl_1 WHERE TYPE=1)
    如果 有索引 主键,TYPE 还会更快另外的需求,请看我这篇文章行号
      

  6.   

    原来现在mysql可以嵌套了...又落伍了
      

  7.   

    对于
    select * from tbl_1 where type=1 order by datetime asc limit 80000;只取最后一行应写作
    select * from tbl_1 where type=1 order by datetime asc limit 80000, 1;如果表中只有80000条记录,则
    select * from tbl_1 where type=1 order by datetime desc limit 1;
      

  8.   


    嗯,没想到这样使用。既然已经问到mysqli_data_seek,有没有朋友熟悉它的?假设就是拿到了一个很大的结果集,用它定位到最后一回比,从头fetch到最后一行,性能差别大吗?
      

  9.   

    mysqli_data_seek
    mysql好象没有缓冲池中间层好象上面的函数处理是这样的!一,连接不能释放;
    二,取时可能要重新要数据库执行这个操作;具体查手册!
    因为打开了一个资源,而资源仍在mysql上!