美文网首页马桶Java
马桶Java :6.高性能MySQL语句(二)

马桶Java :6.高性能MySQL语句(二)

作者: 第二套广播体操 | 来源:发表于2020-04-30 11:12 被阅读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;
    

    原因:

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

    相关文章

      网友评论

        本文标题:马桶Java :6.高性能MySQL语句(二)

        本文链接:https://www.haomeiwen.com/subject/nsczwhtx.html