表记录:一百多万吧。SQL语句:EXPLAIN
SELECT title,add_time 
FROM `picture`   WHERE ( picture.cid = 11 ) 
AND ( `is_show` >= 0 ) AND ( `show_time` >= 1333382399 ) 
ORDER BY `id` DESC LIMIT 0,10
以下是EXPLAIN的结果:"id","select_type","table","type","possible_keys","key","key_len","ref","rows","Extra"
"1","SIMPLE","picture","index","cid","PRIMARY","4",\N,"657","Using where"
cid的索引是多列索引:
cid,show_time,id
三个字段的组合索引。是什么原因导致查询结果这么慢呢???EXPLAIn看得出是哪里问题吗?感觉已经是够优化的了啊。

解决方案 »

  1.   

    create index xxx on picture(cid,show_time,is_show)
      

  2.   

    is_show有几种值?去掉ORDER BY速度有无变化
      

  3.   

     ( picture.cid = 11 ) 
    AND ( `is_show` >= 0 ) AND ( `show_time` >= 1333382399 ) 
    在这三列上建立联合索引
      

  4.   

    cid,show_time,is_show三字段没有索引或有索引没有用到。
      

  5.   

    看EXPLAIN,感觉一切都是比较不错的啊。想不通为啥查询出来就这么慢;
    去掉‘ORDER BY id DESC',查询出来的确是会快上上百倍的。但是必须得排序哦。
      

  6.   


    is_show 就三个值。
    -1 删除
    0 不显示
    1  显示
      

  7.   

    你的explain看的太累了,建议你下次截屏。
    explain的结果是有问题的,Possible_key是cid,但是实际使用的key是"PRIMARY",实际使用的Key长度是4。
    也就是说,MySQL最后选择了使用Primary主键来全表查询,所以需要这么长的时间。
    MySQL认为排序的代价太大了,它更偏向于使用Primary来走索引,而不是走cid的索引,得到数据,然后再排序。这里也是一直被很多人诟病的MySQL的缺点:查询优化器比较弱。建议:
    order by id修改成order by cid,id,cid由于是固定的,所以不会影响结果,但是MySQL的优化器应该会走到cid的多列索引。
    不建议使用force index,这个东西的副作用优点大。