1、反例
SELECT * FROM user WHERE id=1 OR salary=5000
2、正例
(1)使用union all
SELECT * FROM user WHERE id=1
UNION ALL
SELECT * FROM user WHERE salary=5000
(2)分开两条sql写
SELECT * FROM user WHERE id=1
SELECT * FROM user WHERE salary=5000
3、理由
- 使用
or
可能会使索引失效,从而全表扫描; - 对于
or
没有索引的salary
这种情况,假设它走了id
的索引,但是走到salary
查询条件时,它还得全表扫描; - 也就是说整个过程需要三步:全表扫描+索引扫描+合并。如果它一开始就走全表扫描,直接一遍扫描就搞定;
- 虽然
mysql
是有优化器的,出于效率与成本考虑,遇到or
条件,索引还是可能失效的;