网站开发 企业 定制系统,瑞安做企业网站找哪家,深圳市网站建设有限公司,简约型网站在一些集成mybatis的工程中经常看到where11 的代码#xff0c;也有同事问我#xff0c;这样写有什么用#xff0c;下面对其进行简单的分析记录一下。 1、场景
看下面这样一段xml中的代码
select idqueryBook parameterTypecom.platform.entity.Book… 在一些集成mybatis的工程中经常看到where11 的代码也有同事问我这样写有什么用下面对其进行简单的分析记录一下。 1、场景
看下面这样一段xml中的代码
select idqueryBook parameterTypecom.platform.entity.Book resultTypejava.lang.Integerselect count(id) from t_book t where 11
if testtitle !null and title ! AND title #{title}
/if
if testauthor !null and author ! AND author #{author}
/if
/select上面的代码很简单就是查询符合条件的总条数在mybatis中常用到if标签判断where子句后的条件为防止首字段为空导致sql报错。没错 当遇到多个查询条件使用where 11 可以很方便的解决我们条件为空的问题那么这么写有什么问题吗 有人说会不会导致索引失效那么下面来实测一下会不会不走索引。
2、测试
title字段 已经加上索引我们通过EXPLAIN看下
EXPLAIN SELECT * FROM t_book WHERE title 且在人间;EXPLAIN SELECT * FROM t_book WHERE 11 AND title 且在人间;对比上面两条sql的执行结果会发现结果一样possible_keys可能使用的索引 和 key实际使用的索引都使用到了title字段的索引进行检索 。
3、分析
where 11也会走索引不影响查询效率写的sql指令会被mysql进行解析优化成自己的处理指令在这个过程中11这类无意义的条件将会被优化。 使用explain sql进行校对发现确实where11这类条件会被mysql的优化器所优化掉。 那么我们在mybatis当中可以改变一下写法因为毕竟mysql优化器也是需要时间的虽然是走了索引但是当数据量很大时还是会有影响的所以我们建议代码这样写使用where标签代替where 11
select idqueryBook parameterTypecom.ths.platform.entity.Book resultTypejava.lang.Integerselect count(*) from t_book t
where
if testtitle !null and title ! title #{title}
/if
if testauthor !null and author ! AND author #{author}
/if
/where
/select