日期:2014-05-16  浏览次数:20914 次

这条mysql语句explain看起来已经很优化的了,但是执行起来要十几秒
表记录:一百多万吧。

SQL语句:
SQL code

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的结果:
SQL code

"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看得出是哪里问题吗?感觉已经是够优化的了啊。

------解决方案--------------------
create index xxx on picture(cid,show_time,is_show)
------解决方案--------------------
is_show有几种值?去掉ORDER BY速度有无变化

------解决方案--------------------
( picture.cid = 11 ) 
AND ( `is_show` >= 0 ) AND ( `show_time` >= 1333382399 ) 


在这三列上建立联合索引
------解决方案--------------------
cid,show_time,is_show三字段没有索引或有索引没有用到。
------解决方案--------------------
你的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,这个东西的副作用优点大。