随后上一篇文章《 SQL优化案例(1):隐式转换》的介绍,此处内容围绕OR的优化展开。
在MySQL中,同样的查询条件,如果变换OR在SQL语句中的位置,那么查询的结果也会有差异,在多个复杂的情况下,可能会带来索引选择不佳的性能隐患,为了避免执行效率大幅度下降的问题,我们可以适当考虑使用Union all对查询逻辑复杂的SQL进行分离。
常见OR使用场景,请阅读以下案例。
案例一:不同列使用OR条件查询
1.待优化场景
SELECT.... FROM`t1` a WHERE a.token= '16149684' AND a.store_id= '242950' AND(a.registrationId IS NOT NULL AND a.registrationId<> '') OR a.uid= 308475 AND a.registrationId IS NOT NULL AND a.registrationId<> ''
执行计划
+--------------+-----------------------+-----------------+----------------+-------------------+-------------------+---------------+----------------+---------------------------------------------+ | id | select_type | table | type | key | key_len | ref | rows | Extra |+--------------+-----------------------+-----------------+----------------+-------------------+-------------------+---------------+----------------+---------------------------------------------+ | 1 | SIMPLE | a | range |idx_registrationid | 99 | | 100445 | Using index condition; Using where |+--------------+-----------------------+-----------------+----------------+-------------------+-------------------+---------------+----------------+-------------------------------