select * from dx_gd_goods where g_label >= 100101000 and g_label<100102000 order by g_likenum DESC limit 30上面的SQL语句执行要2秒。太慢了。我如果变成这样,但是实际需求是一定要排序的。
select * from dx_gd_goods where g_label >= 100101000 and g_label<100102000  limit 30这样做后,程序只需要0.16秒就可以返回我怎样做才能到排序后,执行的时间又短呢。

解决方案 »

  1.   

    g_label 和 g_likenum 字段都建立索引没有
      

  2.   

    前一个语句执行慢,后一个执行快,我猜测原因是这样的:后者在扫描数据记录的时候,找到符合 where 条件的记录,只要凑够 30 个就好了,即使 g_label 没有索引,只要符合条件的记录在总的数据集合里所占的比例不是特别低,也没有什么问题;而前者则不行,它必须找到符合 where 条件的所有记录,然后再按照 g_likenum 排序,才能取出前面的 30 个,这个过程如果没有适当索引的帮助,很可能导致全表扫描。解决问题的办法当然也只能是设置适当的索引。但是什么样的索引是适当的,还跟你的 dx_gd_goods 表中的数据分布特点有关系。比如,当符合 where 条件的记录所占的比例足够高,而 g_likenum 字段的区分度也很高的情况下,(g_likenum) 这样的索引就已经很好了;但如果符合 where 条件的记录只是相对很少一部分,那么 (g_label, g_likenum) 这样的索引可能效果会更好一点。另外,有的时候数据库(比如 mysql)可能并不一定按你的想像来使用索引,所以要用 explain 进行考察,必要时可以通过 index hint 等手段进行干预。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  3.   

    g_label 和 g_likenum 
    他们二个分别一个索引的
      

  4.   

    g_likenum  是不是数据很集中的那种?enum?
      

  5.   

    这是前段的sql吗?如果是的话你可以给g_label 和 g_likenum建立个符合索引,你的mysql是什么版本?可以的话创建分区呢 
      

  6.   

    在 g_label 和 g_likenum 上建联合索引
      

  7.   

    唠叨大哥,
    我有这样的语句三条,
    select * from dx_gd_goods where g_label >= 100101000 and g_label<100102000 order by g_likenum DESC limit 30select * from dx_gd_goods where g_label >= 100101000 and g_label<100102000 order by g_time DESC limit 30select * from dx_gd_goods where g_label >= 100101000 and g_label<100102000 order by g_hot DESC limit 30
    我是不是要建3个联合索引
    g_label ,g_hot 
    g_label ,g_time 
    g_label ,g_likenum 
    我可不可以这样。
    g_label ,g_hot ,g_time ,g_likenum 我知道本来应该我自己实践的,但是因为建索引的时候太长了,而且我一建数据库就慢,我同事他们那就不流畅,会影响到他们。所以不好实践得,所以只有问问大哥你了。
      

  8.   


    这个样子,你建立分区吧通过g_label,这样我想效果会比较明显,也不用老是建立那么多索引了(如果建立索引依然会有效果,不过这要综合分析你的表使用情况了)
      

  9.   

    不是的,这个表我以经按类型g_type  分了区,
    好像是分不了啦。只能按一种方式分。
      

  10.   

    explain一下,看看是不是正确建立了索引?