企业网站的优势,三只松鼠营销案例分析,唐山有制作网站的没,wordpress官方主题哪个好2哥 :3妹#xff0c;今天怎么下班这么晚啊。 3妹#xff1a;嗨#xff0c;别提了#xff0c;今天线上出bug了#xff0c; 排查了好久。 2哥#xff1a;啊#xff0c;什么问题呀#xff1f; 3妹#xff1a;我们内部的一个管理系统报错了#xff0c; 最近排查下来是myb… 2哥 :3妹今天怎么下班这么晚啊。 3妹嗨别提了今天线上出bug了 排查了好久。 2哥啊什么问题呀 3妹我们内部的一个管理系统报错了 最近排查下来是mybatis报的错。 背景是这样的 背景
这个系统的功能比较简单就是从DB查询用户并列表展示用了1年了都没什么问题。mybatis查询sql是这样的
select idquery resultMapBaseResultMapselect id, name, age from user_info where
if testname !null and name ! name #{name}
/if
if testage !null AND age #{age}
/if
/select2哥这个sql看着也没问题啊 3妹是的 本来这个name不会这空的 所以这个sql一直没问题 可是最近业务逻辑变了,name可能为空。如果name为空的话就导致这条sql是 where and age**, 这样就报错了。。
2哥哦 明白那3妹觉得有什么优化的方案吗 3妹把age查询放在前面吗那这样age为空就也报错了那怎么办呢 2哥其实这种问题有2种解决方案但本质思想是一样的
方案一在where最前面增加 11
比如改成
select idquery resultMapBaseResultMapselect id, name, age from user_info where 11
if testname !null and name ! AND name #{name}
/if
if testage !null AND age #{age}
/if
/select这样where后面不会紧跟and, 就不会报错啦。
方案二表中增加字段deleted
表中增加字段deleted 一是删除可以软删除 二是在where最前面加上deleted0, 这样比加11更优雅也更意义。
select idquery resultMapBaseResultMapselect id, name, age from user_info where deleted0
if testname !null and name ! AND name #{name}
/if
if testage !null AND age #{age}
/if
/select扩展增加11, 对性能有影响吗
网上有种说法是增加11后 就不走索引影响查询性能。那我们来测试下吧 name字段为索引字段 sql1:
EXPLAIN SELECT * FROM user_info WHERE name张三;sql2:
EXPLAIN SELECT * FROM user_info WHERE 11 AND name张三;通过对比上面两种sql输出结果可以看到possible_keys 和 key都使用到了索引进行检索。
结论where 11 也会走索引不影响查询效率。
3妹 我还是在表里增加deleted吧这样更优雅一些还可以软删除一举两得~