不少程序员老司机都会告诉我们,别使用 where 1=1,因为存在性能问题。但实际真的是这样吗?
也有不少看过极客时间《MySQL实战45讲》的朋友回答错误。这虽然是一个小知识,但是很多人都没有思考过这个问题。今天我们来一探究竟。
在很多时候,我们面临着拼接 SQL 的业务。而拼接 SQL 一般需要用 AND 连接,而 where 后面第一个条件是不能写 AND 的,所以,往往在拼接 SQL 时要注意我的查询条件是不是 where 后面的第一个查询条件。如果是,则去掉 AND,如果不是则可以拼接上 AND。
为了减少判断的麻烦,很多人直接在 where 后面写上 1=1 作为第一个查询条件,这样在拼接时,就不需要关注是否需要 AND 了。这种形式,极大的加快了我们的开发效率。然而,有不少人说,where 1=1 浪费性能。
为此,我们通过 MySQL 的执行计划,看看是不是真的有效率方面的问题?
可以看到 where 1=1 对是否索引之类的并无影响。当多条件连接时估计的数据量等于每个筛选条件的选择性相乘。而1等于1这个条件选择性永远为1,所以相乘后不改变原值。另外,1等于1这种常量等式在查询分析器代数优化阶段已经自动过滤了。
其实,1=1 是永恒成立的,意思无条件的,也就是说在 SQL 语句中有没有这个 1=1 都可以。然后 where 1=1 会在优化器执行期间给优化掉。所以,对性能没啥影响。
另外,关于 where AND 这个问题,其实可以从 MySQL 数据库层面给优化掉。比如,AliSQL 等 MySQL 分支将来就可能支持 where 后面第一个查询条件支持 AND,使其在执行时不报错。当然,也可以从框架层面下手去优化,总之手段有很多,更何况 where 1=1 并不影响性能呢!
: » 别再被 where 1=1 骗了好吗?
原创文章,作者:wure,如若转载,请注明出处:https://blog.ytso.com/tech/database/252440.html