MySQL常用函数及解决方案
图
MySQL函数是一些预定义的代码块,用于执行特定的任务并返回一个值,对于不同的应用场景,可能需要使用不同的函数来处理和操作数据。除了内置函数外,MySQL还支持用户自定义函数,可以根据需求编写自己的函数

随机查询

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,让数据库查询时遇到一条就返回,不用再继续查找,业务代码中直接判断返回结果是否非空即可