马桶Java

马桶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;

原因:

使用!=和<>很可能会让索引失效

上一篇下一篇

猜你喜欢

热点阅读