Oracle和Mysql数据库使用Where 1=1会使索引失效吗?-论证

时间:2024-03-20 19:04:24

验证MySQL

1、MySQL表 t_dept的主键DEPT_ID
在这里插入图片描述
2、添加where 1=1 验证,索引类型还是const,证明不影响
在这里插入图片描述
type 显示的是访问类型,是较为重要的一个指标,可取值为:

type 含义
NULL MySQL不访问任何表,索引,直接返回结果
system 表只有一行记录(等于系统表),这是const类型的特例,一般不会出现
const 表示通过索引一次就找到了,const 用于比较primary key 或者 unique 索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL 就能将该查询转换为一个常亮。const于将 “主键” 或 “唯一” 索引的所有部分与常量值进行比较
eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询,关联查询出的记录只有一条。常见于主键或唯一索引扫描
ref 非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,返回所有匹配某个单独值的所有行(多个)
range 只检索给定返回的行,使用一个索引来选择行。 where 之后出现 between , < , > , in 等操作。
index index 与 ALL的区别为 index 类型只是遍历了索引树, 通常比ALL 快, ALL 是遍历数据文件。
all 将遍历全表以找到匹配的行

结果值从最好到最坏以此是:
一般来说, 我们需要保证查询至少达到 range 级别, 最好达到ref 。

NULL > system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL


system > const > eq_ref > ref > range > index > ALL

结论:where1=1不影响MySQL的SQL性能,也不会导致索引失效。因为SQL优化器已经将where1=1过滤了。

验证Oracle

1、Oracle表 gap_borm_object的主键obj_id
在这里插入图片描述
2、添加where 1=1 验证,发现还是走了索引查询
在这里插入图片描述

结论:where1=1同样也不影响Oracle的SQL性能,也不会导致索引失效。

我们回头再考虑一下为什么大家都在说“1=1”会影响SQL的性能,可能在很久之前的sql版本中,“1=1”确实
会影响到sql语句的索引优化过程,这是一个很严重的问题,所以大家都记得这个事,在后来sql将这个问题
给优化掉了,但是很多新人听老人仍在讲这个问题,所以就一直记得,新人变成老人后又给其他新人去说这个
问题,慢慢的大家都记得这个问题,但已经没有人去验证它的真假了。