随机查询
select * from article order by rand() limit 1
字符串拼接concat()
如果在使用MyBatis框架时常用的一种防注入的模糊查询方式,在使用MyBatis时,有两种参数占位符号:#{}
和%{}
,前者会进行安全检查和转义,后者不会,例如在模糊查询时正常逻辑为
select * from user where name like '%${name}'
但是${}
不能防SQL注入,所以不安全,解决方案为使用MySQL的字符拼接函数
select * from user where name like concat('%', #{name})
select * from user where name like concat('%', #{name}, '%')
同理记录in
的方式
id in
<foreach collection="ids" item="item" open="(" separatosr="," close=")">
#{ids}
</foreach>
去重函数
select count(DISTINCT ip)
from req_record
存在查找语句优化
根据条件从数据库中查询出“存在”和“不存在”两种状态,有没有效率更高的方法?
普通方式
SELECT count(*) FROM table WHERE a = 1 AND b = 2
注意:count(1)
和count(*)
的区别
当表的数据量大些时,对表作分析之后,使用count(1)
还要比使用count(*)
用时多了
从执行计划来看,count(1)
和count(*)
的效果是一样的。但是在表做过分析之后,count(1)
会比count(*)
的用时少些(1w以内数据量),不过差不了多少
如果count(1)
是聚索引,id,那肯定是count(1)
快,但是差的很小的
因为count(*)
,自动会优化指定到那一个字段。所以没必要去count(1)
,用count(*)
,sql会帮你完成优化的
因此:count(1)
和count(*)
基本没有差别
优化方案
SELECT 1 FROM table WHERE a = 1 AND b = 2 LIMIT 1
SQL不再使用count
,而是直接返回1,不用做统计,同时有限制LIMIT 1
,让数据库查询时遇到一条就返回,不用再继续查找,业务代码中直接判断返回结果是否非空即可