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

    文章

    809

    浏览量

    47023
  • mybatis
    +关注

    关注

    0

    文章

    64

    浏览量

    7189

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    怎么判断一条 SQL 到底慢在哪?NineData SQL 智能优化能解决什么

    SQL 变慢最怕的不是慢本身,而是大家一开始只能靠猜。明明语法没报错,业务一上线却卡住了;多了一个函数、少了一个索引,或者关联顺序不合适,就可能让数据库白白扫描一大堆数据。很多团队里,这类问题最早
    的头像 发表于 05-19 18:43 137次阅读
    怎么判断一条 <b class='flag-5'>SQL</b> 到底慢在哪?NineData <b class='flag-5'>SQL</b> 智能<b class='flag-5'>优化</b>能解决什么

    [VirtualLab] 光纤耦合透镜的参数优化

    **摘要 ** 光纤是现代光学中最通用的组件之一。它们最具价值的特性之一是能够以极低的损耗极远的距离(甚至几公里)传输光能。另一方面,以尽可能高效率地将光耦合到光纤往往是一项非常微妙的工作:在其
    发表于 05-12 08:15

    NineData SQL AI 智能补全上线:写 SQL,不必每次都从头敲

    。用户只需SQL窗口输入时按Tab键即可快速补全灰色提示内容,无需改变原有操作习惯。这项集成NineDataSQL窗口的轻量化功能,有效减少了编写过程的思路切换和结构确认时间,让
    的头像 发表于 04-01 20:19 367次阅读
    NineData <b class='flag-5'>SQL</b> AI 智能补全上线:写 <b class='flag-5'>SQL</b>,不必每次都从头敲

    NineData 社区版的慢SQL分析,比查看日志+看EXPLAIN适合中小团队

    本文探讨 NineData 社区版 MySQL 慢 SQL 场景对中小团队的适用性。与 “查看日志 + 看 EXPLAIN” 传统方式不同,它将慢 SQL 按模板聚合,能从大盘、模板、诊断等多维
    的头像 发表于 03-17 14:07 185次阅读
    NineData 社区版的慢<b class='flag-5'>SQL</b>分析,比查看日志+看EXPLAIN适合中小团队

    MySQL 慢 SQL 排查这件事,NineData 社区VS DBeaver/ Navicat 技术分析

    社区版的定位不同,它是免费、本地化部署的数据管理平台,将数据库 DevOps、数据复制、数据库对比三大能力整合于一体。 MySQL 慢 SQL 这条链路里,它用到的是 DevOps 的慢查询分析
    的头像 发表于 03-17 11:53 203次阅读
    MySQL 慢 <b class='flag-5'>SQL</b> 排查这件事,NineData 社区VS DBeaver/ Navicat 技术分析

    PKHV3020高压衰减棒不同频率脉冲信号测量的示波器设置优化指南

    本文总结PKHV3020高压衰减棒不同频率脉冲信号测量,提出优化示波器参数设置的方法,以确保准确还原脉冲波形,提升测量性能。
    的头像 发表于 12-09 09:49 739次阅读

    使用NVIDIA Nemotron RAG和Microsoft SQL Server 2025构建高性能AI应用

    搜索和调用外部 AI 模型的 SQL 原生 API。NVIDIA 与微软共同将 SQL Server 2025 与 NVIDIA Nemotron RAG 开放模型集合无缝连接,这使您能够云端或本地环境
    的头像 发表于 12-01 09:31 1185次阅读
    使用NVIDIA Nemotron RAG和Microsoft <b class='flag-5'>SQL</b> Server 2025构建高性能AI应用

    实际网关设计,如何利用电容的高纹波电流能力进行热管理优化

    实际网关设计,如何利用电容的高纹波电流能力进行热管理优化
    发表于 11-26 07:59

    不用编程不用联网,实现倍福(BECKHOFF)PLC对接SQL数据库,上报和查询数据的案例

    各种配置与SQL语句命令,可查阅这篇文章。数据多的话可以导出CSV文件EXCEL编辑后再导入,文件菜单有相关功能按钮。 查看数据的当前值:鼠标双击数据配置表对应的\'序号\',消息栏会显示序号对应
    发表于 10-10 11:14

    数据库慢查询分析与SQL优化实战技巧

    今天,我将分享我处理数千次数据库性能问题中积累的实战经验,帮助你系统掌握慢查询分析与SQL优化的核心技巧。无论你是刚入门的运维新手,还是有一定经验的工程师,这篇文章都将为你提供实用的解决方案。
    的头像 发表于 09-08 09:34 1350次阅读

    SQL 通用数据类型

    SQL 通用数据类型 数据库表的每个列都要求有名称和数据类型。Each column in a database table is required to have a name and a
    的头像 发表于 08-18 09:46 932次阅读

    Text2SQL准确率暴涨22.6%!3大维度全拆

    摘要 技术背景:Text2SQL 是将自然语言查询转为 SQL 的任务,经历了基于规则、神经网络、预训练语言模型、大语言模型四个阶段。当前面临提示优化、模型训练、推理时增强三大难题,研究
    的头像 发表于 08-14 11:17 881次阅读
    Text2<b class='flag-5'>SQL</b>准确率暴涨22.6%!3大维度全拆

    Unicore标准NEMA语句GSA及说明

    本文介绍和芯星通的NEMA语句说明。
    的头像 发表于 07-16 11:39 886次阅读
    Unicore标准NEMA<b class='flag-5'>语句</b>GSA及说明

    基础篇3:掌握Python的条件语句与循环

    Python编程语言中,条件语句和循环是构成复杂逻辑和数据处理的基石。本篇基础教程将帮助您深入了解Python的条件语句和循环结构,让您能够更好地控制程序流程。 条件
    发表于 07-03 16:13

    大促数据库压力激增,如何一眼定位 SQL 执行来源?

    你是否曾经遇到过这样的情况:大促活动期间,用户访问量骤增,数据库的压力陡然加大,导致响应变慢甚至服务中断?更让人头疼的是,当你试图快速定位问题所在时,却发现难以确定究竟是哪个业务逻辑SQL
    的头像 发表于 06-10 11:32 715次阅读
    大促数据库压力激增,如何一眼定位 <b class='flag-5'>SQL</b> 执行来源?