[MySQL系列] 使用STRAIGHT_JOIN 优化inner join查询排序索引问题

项目里有条sql语句使用inner join 语句

但是在增加了order by 左表.字段 desc 后效率非常慢

 

查询explain 如下:

 

 左表字段last_follow_time是有索引的,排序时但是并没有走索引,出现了Using temporary; Using filesort

 

这是因为排序时没有使用左表的字段索引,我们可以强制使用左表作为主表,就可以使用索引了

STRAIGHT_JOIN 替换 inner join,就可以解决问题

 

 

总的来说STRAIGHT_JOIN只适用于内连接,因为left join、right join已经知道了哪个表作为驱动表,哪个表作为被驱动表,比如left join就是以左表为驱动表,right join反之。

而STRAIGHT_JOIN就是在内连接中使用,而强制使用左表来当驱动表,所以这个特性可以用于一些调优,强制改变mysql的优化器选择的执行计划。(也就是说STRAIGHT_JOIN实际上是INNER JOIN的强制指定左表作为驱动表,而不是让mysql优化器去判断和选择)

 

posted @ 2021-10-27 11:34  唯一客服系统开发笔记  阅读(418)  评论(0编辑  收藏  举报