zoukankan      html  css  js  c++  java
  • MyBatis中SQL语句优化小结

    摘要:MyBatis 作为一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。

    MyBatis 作为一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。它免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。还可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。接下来为大家带来在日常应用的过程中的一些小技巧。

    一、MyBatis总结

    1.MyBatis查询/更新语句,没有找到符合条件的记录,会返回什么?

    返回类型为String的, 实际返回null;

    返回类型为对象的:实际返回null ;

    返回类型为列表等集合: 实际返回空集合[];

    返回类型为Boolean:实际返回false

    当数据库语句插入条件不满足,会返回false;比如使用dual的SQL语句;

    2.mybatis会抛出哪些常见异常?

    不是所有的异常,都认为程序出异常要报错,

    比如用户重复收藏商品,可以直接返回成功,这时候对“违反唯一键”异常要特殊处理。

    (1) 插入语句

    DataIntegrityViolationException: 违反非空约束、数据大小超过约束

    DuplicateKeyException:违反唯一键约束

    CannotAcquireLockException: for update nowait 超时

    (2)更新语句

    条件不满足时,会返回false

    数据库操作应该判断返回值,比如下面BUG:

    (3) bug类,表字段找不到等场景

    MyBatisSystemException

    BadSqlGrammarException

    3.事务里面套用for update,看上去绕过了事务

    等for update获取锁后,select出来的是最新的数据

    4.for update是一种行级锁,又叫排它锁,

    一旦用户对某个行施加了行级加锁,则该用户可以查询也可以更新被加锁的数据行,其它用户只能查询但不能更新被加锁的数据行;

    如果查询条件带有主键,会锁行数据,如果没有,会锁表。

    如果一定要用FOR UPDATE,建议加上NOWAIT 或 for update wait 3

    二、SQL优化

    1. 约束条件:数据表增加表的约束条件,防止脏数据。

    2. limit1:如果我们知道返回结果只有 1 条,就可以使用LIMIT 1,告诉 SELECT 语句只需要返回一条记录即可。这样的好处就是 SELECT 不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。

    3.拼写风格:SQL保留字使用英文大写,其他使用英文小写;提高可读性。

    4.Like:使用like加通配符,可能使得索引失效,会触发全表扫描。如果要让索引生效,那么 LIKE 后面就不能以(%)开头,比如使用LIKE '%太%'或LIKE '%太'的时候就会对全表进行扫描。如果使用LIKE '太%',同时检索的字段进行了索引的时候,则不会进行全表扫描。

    5.对常用于搜索的字段添加索引,能极大增加查询效率

    6.使用“自连接”优于子查询。

    7.使用视图:

    视图可以理解成给一个查询SQL起个别名。

    只不过提前经过编译,视图不能传入变量,不保存数据

    视图的优点是:隔绝数据表操作

    8.使用临时表:

     使用类似两层for循环,遵循小表驱动大表原则。

    如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
    例如:表A(小表),表B(大表)

    select * from A where cc in (select cc from B) ;//  效率低,用到了A表上cc列的索引;
    select * from A where exists(select cc from B where cc=A.cc) ;// 效率高,用到了B表上cc列的索引。

    10.不建议使用索引的情况:

    (1)总数据量很少。

    (2)数据重复度大,且不同取值分布均匀,比如性别男女比例各接近50%。

    11.唯一索引/唯一键有3个字段时,按其中1个字段查询,是否比没有索引效率高?

    ---- 没有,这种情况创建唯一键,更多的是为了保证数据正确性。

    (1)唯一索引和唯一键的区别?

    (2)创建联合索引时,我们需要注意创建时的顺序问题,因为联合索引 (x, y, z) 和 (z, y, x) 在使用的时候效率可能会存在差别。比如刚才举例的 (x, y, z),如果查询条件是 WHERE x=1 AND y=2 AND z=3,就可以匹配上联合索引;如果查询条件是 WHERE y=2,就无法匹配上联合索引。

    12.连接表:

    (1)连接表的数量尽量不要超过 3 张,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长会非常快,严重影响查询的效率。

    (2)对用于连接的字段创建索引,并且该字段在多张表中的类型必须一致。比如 user_id 在 product_comment 表和 user 表中都为 int(11) 类型,而不能一个为 int 另一个为 varchar 类型。

    13.索引失效情况

    (1)在 WHERE 子句中,如果在 OR 前的条件列进行了索引,而在 OR 后的条件列没有进行索引,那么索引会失效。

    (2)索引列尽量设置为 NOT NULL 约束。

    14.数据表字段,不要用bool类型,用int2 代替 bool类型,增加扩展能力

    本文分享自华为云社区《mybatis使用及SQL语句优化小结》,原文作者:搬搬砖打打游戏 。

     

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    springmvc log4j 配置
    intellij idea maven springmvc 环境搭建
    spring,property not found on type
    intellij idea maven 工程生成可执行的jar
    device eth0 does not seem to be present, delaying initialization
    macos ssh host配置及免密登陆
    centos7 搭建 docker 环境
    通过rest接口获取自增id (twitter snowflake算法)
    微信小程序开发体验
    gitbook 制作 beego 参考手册
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/14240952.html
Copyright © 2011-2022 走看看