今天由于数据库数据量很大,在SQL关联查询的时候,前端页面出现了连接超时的错误。经过本地DEBUG 拿出来SQL语句,到数据库查询。果然!查询贼慢。居然需要1分钟,甚至更多。
LEFT JOIN 关联查询:
LEFT关联查询
查看一下执行计划:
执行计划当中的 type=ALL 全表扫描, key 值 为空,连索引都没有用到,还有 Extra 这里边的意思不是太明确,但是一看就不是什么好的结果,应该是SQL语句需要优化的提示。
left join 执行,目前来看是会以 pro_dish 表作为驱动表,进行全表扫描以后,对其他表进行笛卡尔积查询。
INNER JOIN 关联查询:
INNER JOIN 关联查询
INNER JOIN 执行计划:
虽然执行计划跟 left join 的执行计划大同小异。但是,为什么inner join 却要比 left join 查询快2倍的效率。
我个人认为是,inner join 没有进行 笛卡尔积的计算?那位大神知道,希望指点。
子查询:
可以看到子查询明显更快了,这是因为,子查询中携带了条件。他会先在单表中,筛选中满足条件的数据。之后再去跟其他表关联查询。显然会快很多。但是,我后来又试了一下,子查询中不加条件的话,也是同样很慢。
最后,我只能在代码中,进行了条件的判断。后端写了多个查询方法,如果满足子查询条件的,走子查询的方法。不满足的走其他方法。目前,只能这么优化了。
具体SQL更深入的优化,还在进一步研究中。
有大神知道如何优化的,可以在下方留言讨论起来。
还有对于 explain 命令,如何查看SQL优化,明白的大神,指导一下。