在我不使用聚合的长而复杂的查询中,我将其中一个AND
ed where子句移到了一个新的HAVING
子句中。
从逻辑上讲,结果是相同的,行在返回之前经过筛选。
从语义上讲,结果可能在某些方面有所不同,我不理解。
但就性能而言,它的运行速度要快3倍。我知道这是因为我搬家的事情是做一个昂贵的NOT EXISTS (SELECT ...)
。以前,服务器会花时间评估可以使用其他更简单规则排除的行。
这种优化方法是否违反了任何官方或非官方规则
没有这样的规则。
由于联接位于WHERE子句之前,因此可以减少将根据WHERE子句进行检查的行数。
它通常有点讨好,因为你可能会错过一些需要的行。
所以基本上你可以做到,但必须检查,如果所有想要的行都在那里。
WHERE
子句ANDed
在一起的顺序-->优化器(如果可以自由重新排列)- 也有一些例外:先搜索
FULLTEXT
;子查询最后。(我不确定。) - 引用聚合-->必须在
HAVING
中 - 否则CCD_ 8和CCD_ 9具有相同的语义
- CCD_ 10在逻辑上在CCD_ 11之前完成;CCD_ 12在之后完成
- 似乎你已经发现,如果
NOT EXISTS
在其他测试之后以某种方式被迫出现,它会更有效率;并且将其移动到CCD_ 14似乎已经实现了这一点
提交一份错误报告(jira.mariadb.com),表明您发现优化器没有像它应该的那样处理子句。
如果您向我们展示实际的查询,我们也许可以更深入地了解。