别再被 where 1=1 骗了好吗?

SQL herman 273浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

不少程序员老司机都会告诉我们,别使用 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

可以看到 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 并不影响性能呢!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 别再被 where 1=1 骗了好吗?