wer.dp_sigs表数据有200w,下面这条语句的查询竟然花了20秒的时间,前提是modifyat与type1都建立了索引,有什么方法能再优化?
select md5, name, tags1 from 
                    wer.dp_sigs  where modifyat <= (select modifyat from 
                    wer.dp_sigs where type1=3 order by modifyat desc limit 0,1) and type1=3
                    order by modifyat desc limit 30之前看过一篇文章的介绍,上面这查询的写法明显比下面这查询语句要快。select md5, name, tags1 from 
                    wer.dp_sigs where type1=3 order by modifyat desc limit 0,30大伙有没有更好的解决方法啊,其实我要的结果就是分页,前提是modifyat必须要排倒序。

解决方案 »

  1.   

    你中间的子查询根本就没有必要!!
    select   `md5`,
             name,
             tags1
    from     wer.dp_sigs
    where    type1 = 3
    order by modifyat desc
    limit    30;对应索引:
    alter table wer.dp_sigs add key idx_type1_modifyat(type1,modifyat);
      

  2.   

    我认为1楼说的是有道理的
    add key idx_type1_modifyat(type1,modifyat);
    加上这就可以解决
      

  3.   

    确实没看出中间的子查询有什么必要不过觉得索引的话 需要对 type1 和 modifyat 分别建立索引
      

  4.   

    [Quote=引用 6 楼 bill830711 的回复:]
    引用 1 楼 yueliangdao0608 的回复:
    你中间的子查询根本就没有必要!! 
    SQL code 
    select  `md5`, 
            name, 
            tags1 
    from    wer.dp_sigs 
    where    type1 = 3 
    order by modifyat desc 
    limit    30; 对应索引: 
    alter table wer.dp_sigs add key idx_type1_modifyat(type1,modifyat); 
     
    确实没看出中间的子查询有什么必要 
      

  5.   

    子查询的目的是缩小范围,借助索引范围优化。。不过俺不觉得这样有效。
    索引应该是modifyat打头的联合索引