mysql orderby 后多个排序的索引问题

sql语句:

SELECT
    *
FROM
    jh_ask 
ORDER BY
    `answer_num` DESC,
    `dateline` DESC,
    `views` DESC,
    `orderby` ASC
LIMIT 0,10;

数据总量5.4W条,根据sql的order by后的几个排序字段,建立了answer_num,dateline,views,orderby 4个字段的联合索引order,发现执行还是慢,explain了一下,如下图:

clipboard.png
发现索引根本没用到,进行了全表扫描,我该怎么做才能让他用上索引?

SELECT
    *
FROM
    jh_ask 
ORDER BY
    `answer_num` DESC,
    `dateline` DESC,
    `views` DESC
LIMIT 0,10;

如果去掉最后的orderby,是可以用上索引的

clipboard.png


已经发现问题,好像order by后的排序方向要一致才能用上索引,只要有其中一个不是一个方向的,就不能用上,那像我这种情况还能优化么?

阅读 13.6k
4 个回答

确实的,mysql复合索引还不支持不同类型的排序操作,即使建立索引时定义不同的排序也是无效的,这是mysql索引的一个待优化的地方。对于你的情况sql本身基本没有优化空间,从业务逻辑层看看吧

mysql走使用第二个排序的原因第一个排序字段的值相同...
走第三个排序的原因是第二个排序字段的值相同...
我不知道你的插入速度有多快.第二个字段dateline是时间吧.精确到秒的话几乎就没有重复的了.也就是说其实第三个列的排序跟第四个列的排序可能仅仅是"以备不时之需"而已...
所以...第四个可以不加入索引...毕竟几乎用不到...
所以你现在的索引其实很完美了...
如果再想完美一点的话.把select后面的*改成具体的字段.然后把具体的字段加入到索引后面...减少回表读取的次数来提高速度.但是会陷入另一个问题.索引占用的空间过大引起的其他问题...自己权衡吧...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题