0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在使用MyBatis中SQL语句优化总结

华为开发者社区 来源:华为云社区 作者:搬搬砖打打游戏 2021-02-04 15:20 次阅读

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

1

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

2

SQL优化

约束条件:

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

limit1:

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

拼写风格:

SQL保留字使用英文大写,其他使用英文小写;提高可读性。

Like:

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

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

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

使用视图:

视图可以理解成给一个查询SQL起个别名。 只不过提前经过编译,视图不能传入变量,不保存数据 视图的优点是:隔绝数据表操作

使用临时表:

http://9.IN/EXIST 使用类似两层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列的索引。

不建议使用索引的情况:

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

唯一索引/唯一键有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,就无法匹配上联合索引。

连接表:

(1)连接表的数量尽量不要超过 3 张,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长会非常快,严重影响查询的效率。 (2)对用于连接的字段创建索引,并且该字段在多张表中的类型必须一致。比如 user_id 在 product_comment 表和 user 表中都为 int(11) 类型,而不能一个为 int 另一个为 varchar 类型。

索引失效情况

(1)在 WHERE 子句中,如果在 OR 前的条件列进行了索引,而在 OR 后的条件列没有进行索引,那么索引会失效。 (2)索引列尽量设置为 NOT NULL 约束。

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

原文标题:学起来!MyBatis中SQL语句优化小结

文章出处:【微信公众号:华为开发者社区】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    764

    浏览量

    44132
  • mybatis
    +关注

    关注

    0

    文章

    60

    浏览量

    6714

原文标题:学起来!MyBatis中SQL语句优化小结

文章出处:【微信号:Huawei_Developer,微信公众号:华为开发者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    浅谈SQL优化小技巧

    存储缓存的数据; (3)未命中缓存后,MySQL通过关键字将SQL语句进行解析,并生成一颗对应的解析树,MySQL解析器将使用MySQL语法进行验证和解析。 例如,验证是否使用了错
    的头像 发表于 12-25 09:59 418次阅读

    SSM框架的性能优化技巧 SSM框架RESTful API的实现

    缓存操作。 优化SQL查询 : SQL查询是数据库操作的瓶颈之一。 使用索引来加速查询,避免全表扫描,尽量使用索引扫描。
    的头像 发表于 12-17 09:10 167次阅读

    SQL错误代码及解决方案

    SQL数据库开发和管理,常见的错误代码及其解决方案可以归纳如下: 一、语法错误(Syntax Errors) 错误代码 :无特定代码,但通常会在错误消息明确指出是语法错误。 原因
    的头像 发表于 11-19 10:21 1673次阅读

    大数据从业者必知必会的Hive SQL调优技巧

    大数据从业者必知必会的Hive SQL调优技巧 摘要 :大数据领域中,Hive SQL被广泛应用于数据仓库的数据查询和分析。然而,由于数据量庞大和复杂的查询需求,Hive SQL查询
    的头像 发表于 09-24 13:30 267次阅读

    QPS提升10倍的sql优化

    当时的sql优化过程 1. 问题背景 大促准备期间发现4c16G的单实例mysql数据库,每逢流量高峰都会有cpu 100%的问题,集中0点和12点。 但也存在相近大小的流量cpu利用率相差很大的情况
    的头像 发表于 08-21 11:12 355次阅读
    QPS提升10倍的<b class='flag-5'>sql</b><b class='flag-5'>优化</b>

    IP 地址 SQL 注入攻击中的作用及防范策略

    SQL 注入是通过将恶意的 SQL 代码插入到输入参数,欺骗应用程序执行这些恶意代码,从而实现对数据库的非法操作。例如,一个登录表单
    的头像 发表于 08-05 17:36 312次阅读

    如何在SQL创建触发器

    SQL,触发器(Trigger)是一种特殊类型的存储过程,它自动执行或激活响应表上的数据修改事件(如INSERT、UPDATE、DELETE等)。触发器可以用于维护数据库的完整性、自动化复杂
    的头像 发表于 07-18 16:01 1884次阅读

    什么是 Flink SQL 解决不了的问题?

    简介 实时数据开发过程,大家经常会用 Flink SQL 或者 Flink DataStream API 来做数据加工。通常情况下选用2者都能加工出想要的数据,但是总会有 Flink SQ
    的头像 发表于 07-09 20:50 313次阅读

    性能优化之路总结

    针对老项目,去年做了许多降本增效的事情,其中发现最多的就是接口耗时过长的问题,就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。    一、接口优化方案总结 1
    的头像 发表于 06-17 15:00 342次阅读

    SQL全外连接剖析

    SQL的全外连接是什么? SQL,FULLOUTERJOIN组合左外连接和右外连接的结果,并返回连接子句两侧表
    的头像 发表于 03-19 18:28 2240次阅读
    <b class='flag-5'>SQL</b>全外连接剖析

    assign语句和always语句的用法

    的用法和功能。 一、Assign语句 Assign语句的定义和语法 Assign语句用于HDL连续赋值,它允许
    的头像 发表于 02-22 16:24 2564次阅读

    labview 创建mysql 表时 设置时间 怎么mysql是格式是date 而不是datetime?

    选择 时间日期 但是mysql是date而不是datetime类型 ,除了sql语句创建表 ,怎么能实现创建表数据为datetime类
    发表于 02-04 09:46

    查询SQLmysql内部是如何执行?

    我们知道mySQL客户端,输入一条查询SQL,然后看到返回查询的结果。这条查询语句 MySQL 内部到底是如何执行的呢?本文跟大家探讨一下哈,我们先来看下MySQL基本架构~
    的头像 发表于 01-22 14:53 575次阅读
    查询<b class='flag-5'>SQL</b><b class='flag-5'>在</b>mysql内部是如何执行?

    单片机if是什么语句

    单片机的if语句是一种条件语句,用于根据不同的条件执行不同的代码块。程序执行过程,条件语句
    的头像 发表于 01-05 14:04 1811次阅读

    单片机for语句的运用

    单片机的for语句是一种常见的循环控制结构,用于重复执行一段代码块,可以简化程序的编写和减少代码量。本文将详细介绍单片机for语句的运用。 一、for
    的头像 发表于 01-05 14:02 2459次阅读