MySQL WHERE子句中A条件为false时,是否还会校验AND连接的B条件?
问题解答
核心结论
你提到的场景下,MySQL不会校验username不匹配的行的password字段,现有SQL逻辑不需要调整。
具体原理说明
- 首先AND逻辑本身存在短路求值特性:MySQL处理WHERE子句的AND条件时,只要前序条件判断为假,后续的条件会直接跳过执行,不会做无效校验。也就是说某行的
username不等于目标值时,会直接跳过该行,不会读取、校验该行的password字段。 - 其次如果你的
username字段设置了唯一索引(登录场景下用户名本身就应该满足唯一约束,强烈建议建唯一索引),MySQL会直接通过索引定位到唯一符合username = 'something'的行,根本不会扫描其他不相关的行,全程只需要对1行数据做password字符串匹配,性能开销可以忽略不计。
业务逻辑建议
现有逻辑已经足够高效,不需要拆分成「先查username对应的哈希密码、再后端比对」的逻辑,反而拆分后会多一次数据库请求,增加不必要的交互开销。
只有当你需要使用慢哈希算法做密码校验(校验过程本身需要大量计算资源)时,才适合把密码比对逻辑放到后端处理,避免占用数据库计算资源,普通字符串等值比对场景下直接在SQL中加条件效率更高。
内容的提问来源于stack exchange,提问作者Pulse
相关产品推荐
相关产品推荐

