WHERE条件避免以某种方式进行全表扫描

时间:2018-10-24 18:43:06

标签: mysql database-performance

在评估创建SQL视图查询的性能时,我注意到在末尾添加WHERE子句时性能有了显着提高。输出差异不大(行减少约3%)。

例如

SELECT x,y,z  
FROM (multiple table joins/sub queries)

vs

SELECT x,y,z  
FROM (multiple table joins/sub queries)  
WHERE x >= 0 (x is not indexed)

检查执行计划,似乎最大的不同是WHERE条件避免了全表扫描,这可以解释速度上的差异。为什么会这样?

编辑:屏幕截图显示了在有条件条件下与没有条件条件下的执行操作

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

(即使有屏幕截图,也没有足够的信息来智能地答复。但是我可以猜测...)

面对JOIN(s)时,优化器经常(但并非总是)使用以下规则来确定以哪个表开头:

  • 从似乎具有最佳WHERE过滤的表开始。可能 导致它选择了其中带有x的桌子。即使是全表扫描,选择该表也可能更好。

  • 从“最小”表开始。

注意:它将扫描“第一个”表;对于该表中的每一行,它会到达“下一个”表,然后进入下一个表,依此类推。Optimizer可以根据需要自由地对表重新排序(在LEFT这样的约束内)。

实际上,Optimizer的后续版本使用“基于成本”的分析。但是,以上两个“规则”是有效发生的。

此外,优化程序可能会因其基于查询计划的统计信息而被误导。