表 tcharge  数据200万条左右.
主键id,字段15个.目前无法添加索引.那么下面两条哪条会效率高一些,或者是说,有没有更好的办法让效率高一些,现在很慢.
1.
select statu_id from tcharge  where phone=? and cash=? and time>? order by id desc
2.
select statu_id from (select phone,cash,time from tcharge order by id desc limit 300) where phone=? and cash=? and time>?

解决方案 »

  1.   

    你的语句都没用到索引,where后面加上id>0,这样查询的时候就会用到索引(主键也是一个索引)。
      

  2.   

    两条sql出来的结果都不一样,这样比较有意义吗?
      

  3.   

    是这样的,第一天的时间是1个小时以内,一般有200条左右,
    后面我就直接查300条以内的了.基本上是一样的.
    对了第二条写错了.应该是:
    2.
    select statu_id from (select statu_id,phone,cash,time from tcharge order by id desc limit 300) where phone=? and cash=? and time>?
      

  4.   

    select statu_id from tcharge  where id>0 and phone=? and cash=? and time>? order by id desc 这样会好些?
      

  5.   

    感觉上第二个快,不过建议看一下执行计划。explain select statu_id from tcharge  where phone=? and cash=? and time>? order by id desc;
    explain select statu_id from (select statu_id,phone,cash,time from tcharge order by id desc limit 300) where phone=? and cash=? and time>?贴一下结果。
      

  6.   

    第二快~
    一个查询快不快,首先看你遍历了多少行数据;
    先不用看explain,从数据库干的事情来理解就知道第一条语句,其中有where子句,而且因为你的where子句列出的字段,没有一个字段有索引,所以会遍历所有200W条记录中挑出满足记录的行,然后再按id做排序,因为id有索引,所以时间消耗在挑记录上第二条,虽然是两个语句,但是外层的时间基本可以忽略了,因为是从内层的300行中查询
    内层,按id排序,id有索引,然后只要前300行,那么遍历的行就是300行(关于limit扫描表的行数,看mysql手册关于limit的说明)再通过explain验证
    第一条的rows项的值肯定是表的总行数;
    第二条,外层语句rows项是300,内层虽然也是总数,但是基于mysql的limit优化,实际rows是300;所以按照扫描表的行数来说,第二条肯定快过第一条;
      

  7.   

     MySQL  手册对  Limit  参数优化扫描的一些说明:在一些情况中,当你使用 LIMIT 选项而不是使用 HAVING 时, MySQL 将以不同方式处理查询。l          如果你用 LIMIT 只选择其中一部分行,当 MySQL 一般会做完整的表扫描时,但在某些情况下会使用索引(跟 ipart 有关)。l          如果你将 LIMIT n 与 ORDER BY 同时使用,在 MySQL 找到了第一个符合条件的记录后,将结束排序而不是排序整个表。l          当 LIMIT n 和 DISTINCT 同时使用时, MySQL 在找到一个记录后将停止查询。l          某些情况下, GROUP BY 能通过顺序读取键 ( 或在键上做排序 ) 来解决,并然后计算摘要直到键值改变。在这种情况下, LIMIT n 将不计算任何不必要的 GROUP 。l          当 MySQL 完成发送第 n 行到客户端,它将放弃余下的查询。l          而 LIMIT 0 选项总是快速返回一个空记录。这对检查查询并且得到结果列的列类型是有用的。l          临时表的大小使用 LIMIT # 计算需要多少空间来解决查询。