避免在where子句中使用 or 来连接条件

简介: 避免在where子句中使用 or 来连接条件

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条件,索引还是可能失效的;

 

 

相关文章
|
2月前
|
Python
`else`子句可以与`while`循环结合
【9月更文挑战第07天】
73 8
|
3月前
|
SQL Serverless 数据库
HAVING和WHERE子句 有什么区别?
【8月更文挑战第2天】
124 17
HAVING和WHERE子句 有什么区别?
|
3月前
|
SQL 数据库
|
6月前
T-sql 高级查询( 5*函数 联接 分组 子查询)
T-sql 高级查询( 5*函数 联接 分组 子查询)
|
6月前
|
SQL 数据库
SQL HAVING 子句详解:在 GROUP BY 中更灵活的条件筛选
HAVING子句被添加到SQL中,因为WHERE关键字不能与聚合函数一起使用。
225 0
|
数据库
子查询与内连接查询区别(效率上,连接查询高于子查询)、左连接以及连接的原理,还有内连接与左连接的区别
子查询与内连接查询区别(效率上,连接查询高于子查询)、左连接以及连接的原理,还有内连接与左连接的区别
1129 0
子查询与内连接查询区别(效率上,连接查询高于子查询)、左连接以及连接的原理,还有内连接与左连接的区别
|
Shell
一.条件选择:if语句
一.条件选择:if语句
138 0
|
SQL 关系型数据库 MySQL
SQL优化--关联子查询的前世今生
SQL优化--关联子查询的前世今生
217 0
SQL优化--关联子查询的前世今生
|
SQL 关系型数据库 MySQL
嵌套套娃,MySQL子查询,单行与多行子查询,相关和不相关(关联)子查询,完整详细可收藏
嵌套套娃,MySQL子查询,单行与多行子查询,相关和不相关(关联)子查询,完整详细可收藏
249 0
嵌套套娃,MySQL子查询,单行与多行子查询,相关和不相关(关联)子查询,完整详细可收藏
|
SQL 关系型数据库 MySQL
三、避免在where子句中使用 or 来连接条件
三、避免在where子句中使用 or 来连接条件
136 0