马桶Java :6.高性能MySQL语句(二)
2020-04-30 本文已影响0人
第二套广播体操
马桶🚽Java 上厕所就能看完的小知识! 欢迎关注、点赞 持续更新!
以下文章整理自公众号 :捡田螺的小男孩
并结合自己学习的一些规范整理而出。当然这只是建议因为作者觉得可以提高性能
每一条建议都提供了具体实例,欢迎指正和学习哦
6. 使用where条件限定要查询的数据,避免返回多余的行
查询某个用户是否是会员。曾经看过老的实现代码是这样
反例:
List<long> userIds = sqlMap.queryList("select userId from user where isVip=1");
boolean isVip = userIds.contains(userId);
正例:
有许多种,但是如今大多数的框架都有相应的方法,需要精准查询到一条。
原因:
需要什么数据,就去查什么数据,避免返回不必要的数据,节省开销。
7. 尽量避免在索引列上使用mysql的内置函数
避免在索引列
查询最近七天内登陆过的用户(假设loginTime加了索引)
反例:
ps: where 语句使用的Date_ADD()
计算日期增加 Interval 7 DAY
意思的日期偏移七天
select userId,loginTime from loginuser where Date_ADD(loginTime,Interval 7 DAY) >=now();
正例:
explain select userId , loginTime from loginuser where loginTime >= Date_ADD (NOW (),INTERVAL-7 DAY);
原因:
如果在索引列上走内置函数会造成索引失效,而不在索引上添加内置函数是可以走索引的
8.应尽量避免在where子句中对字段进行表达式操作,这将导致系统放弃使用索引而进行全表扫
反例:
select * from user where age-1 =10;
正例:
select * from user where age =11;
原因:
explain
操作发现表达式操作不会走索引
9. Inner join 、left join、right join,优先使用Inner join,如果是left join,左边表结果尽量小
三者区别:
Inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集
left join 在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
right join 在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。
都满足SQL需求的前提下,推荐优先使用Inner join(内连接),如果要使用left join,左边表数据结果尽量小,如果有条件的尽量放到左边处理。
主要是返回的行数会少,所以性能会好一些。对性能影响可能不是很大,可以作为一种规范。
10. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
反例:
select age,name from user where age <>18;
正例:
-- 可以考虑分开两条sql写
select age,name from user where age <18
union all
select age,name from user where age >18;
原因:
使用!=和<>很可能会让索引失效