$sql = "SELECT a.goods_ids,a.order_id,a.status_endtime,a.is_comment,a.comment_lock,b.suppliers_id,b.mobile,b.qq, b.company_name, a.order_sn, a.order_status, a.shipping_status, a.pay_status, a.shipping_fee, a.postscript, a.add_time, a.pay_id, a.order_amount, " . "(a.goods_amount + a.shipping_fee + a.insure_fee + a.pay_fee + a.pack_fee + a.card_fee + a.tax - a.discount) AS total_fee ". " FROM  ecs_order_info as a left join ecs_suppliers as b on a.suppliers_id=b.suppliers_id WHERE a.user_id = '$user_id' ORDER BY a.add_time DESC";  $res = $GLOBALS['db']->SelectLimit($sql, $num, $start);
这是我写的一个 ecshop订单的联表查询,数据读写都没问题,但是现在订单多了查询变得特别特别慢,我不知道这个该怎么优化,希望大神帮忙!一定重谢!

解决方案 »

  1.   

    以文本方式贴出 
    explain select ...
    show index from ..
    以供分析。
      

  2.   

    给这个价格索引a.add_time,看下ecs_suppliers这个的show index ,
    另外为什么a表会有这么多个索引,状态字段都要建索引?
    explain不是那样用的,要explain下你的select语句即explain $sql(这个$sql是你的select语句)
      

  3.   

    断点调试,打出你的 $sql  语句实际内容。
    然后在MYSQL中 explain select ..
      

  4.   


    ecs_order_info 表可以创建一个联合索引:create index idx_ecs_order_info_cc on ecs_order_info(user_id,add_time desc)
      

  5.   


    我把索引都给删掉了  象你说的explain  了一下 
      

  6.   


    我把索引都删掉了 ,然后重新explain select 了一下 您看下图片
      

  7.   

    我试了但是不管用,应该还是索引的不对   不过这个语法学会了。。你的user_id是什么类型的,如果是数字类型的话,最好不要加上引号,不然导致用不上索引:
    WHERE a.user_id = $user_id
      

  8.   

    我试了但是不管用,应该还是索引的不对   不过这个语法学会了。。你的user_id是什么类型的,如果是数字类型的话,最好不要加上引号,不然导致用不上索引:
    WHERE a.user_id = $user_id
    是 mediumint(8) 类型,按照版主你说的,删掉引号也不起作用,还是慢的很厉害
      

  9.   


    我把索引都给删掉了  象你说的explain  了一下 

    a 表全表扫描,b表使用了主键索引,所以在a表建立索引,你a表的主键索引可以不要删除。
      

  10.   


    我把索引都给删掉了  象你说的explain  了一下 

    a 表全表扫描,b表使用了主键索引,所以在a表建立索引,你a表的主键索引可以不要删除。
    已经解决了谢谢您回复本帖!
      

  11.   

    我试了但是不管用,应该还是索引的不对   不过这个语法学会了。。你的user_id是什么类型的,如果是数字类型的话,最好不要加上引号,不然导致用不上索引:
    WHERE a.user_id = $user_id已解决谢谢回复!
      

  12.   

    已解决啦,原因是 我使用了 ORDER by a.add_time DESC而我的 add_time 表里面的 是 linux 时间戳,我给时间戳改成带有格式的 2016-03-22 22:33:06 就好了!