SQL优化

一、巧用limit分页查询(id必须有序)

二、like百分号向右

说明:全模糊查询或者左边出现%的模糊查询会导致索引失效,应该尽量从查询方式或表结构设计上避免,若无法避免且数据量庞大的情况下,一定要使用elasticsearch来进行替代

三、union加个all

说明:union对两个结果集进行并集操作时,不包括重复行,相当于distinct,同时进行默认规则的排序,而union+all对两个结果集进行并集操作时,包括重复行,且不进行排序,union因为要进行重复值扫描,所以在结果集庞大的情况下效率极低,因此建议使用union+all,若结果集去重是强需求,则在应用程序代码上进行去重,因为数据库资源要比应用服务器资源更加珍贵

四、善用straight_join(小数据表驱动大数据表)

说明:straight_join功能与inner join类似, 但它能让左边的表来驱动右边的表,通过改变优化器对于联表查询的执行顺序的方式获取更好的性能;若驱动表(左边)的数据量小于被驱动表(右边)的数据量,它的执行性能要高于驱动表的数据量大于被驱动表

假设我们事先知道t2表的数据量一定小于t1表的话,就可以使用上面的方式指定t2表为驱动表,注意事项:straight_join只适用于inner_join并不适合left join和right join;大部分情况下,MySQL优化器是可以做出正解的,因此使用straight_join一定要慎重,因为人为指定的执行顺序并不一定会比优化引擎靠谱

五、exists和in的取舍

如果子查询得出的结果集数据较少,主查询中的表较大且又有索引时,应该用in

反之,如果外层的主查询数据较少时,子查询中的表大且又有索引时,应该用exists

如果是exists,以外层表为驱动表,先被访问,如果是in,那么先执行子查询,in是把内表和外表做哈希连接,而exists是对外表做loop循环,每次loop循环再对内表进行查询

所以,我们会以驱动表的快速返回为目标,目标是以小表来驱动大表,这是性能优化的本质

六、清表要用truncate

说明:truncate是直接把表删除 ,然后重建表结构,性能很高,但删除操作记录不记入日志,不能回滚;而delete语句执行删除的过程是每次从表中删除一行,性能较低,但该行的删除操作会作为事务记录在日志中保存,以便进行回滚操作

truncate后表和索引所占用空间会恢复到起始大小,而delete只是将被删除的记录标记为已被删除,并不会立即减少表或索引所占用的空间

七、尽量批量操作

说明:SQL批量操作即一次数据库操作中插入多个数据行相比于单条插入可减少大量的IO交互和SQL解析开销,从而提高了插入效率

八、过滤优先于一切

说明:无论是分组还是排序还是多表join,如果可以的话,第一件事就是把用不到的记录先过滤掉

九、函数在等号右侧

说明:如果在索引列上使用函数,会导致索引失效 

十、数据类型最小可用

说明:一般情况下,应该尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常会使SQL执行更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更少,但是要确保没有低估需要存储的值的范围,因为在表schema中,修改数据类型是非常耗时和痛苦的操作(表数据流很大时),如果无法确定哪个数据类型是最好的,就选择你认为不会超过范围的最小类型

十一、char和varchar的抉择

说明:char:例如手机号、电话、身份证号、密码等,长度不够的话,采取右补空格的方式

varchar:具体规则是如果列的最大长度小于于等于255字节,则使用1个字节表示,否则使用2个字节,varchar由于行是变长的,在update的时候可能使行变得比原来更长,会导致分裂页和产生碎片

十二、varchar长度最小可用

十三、适当的索引策略

说明:频繁需要查询的字段应该创建索引 ,频繁更新的字段不适合创建索引,多表关联查询中的关联字段、查询中统计或者分组字段或者排序字段应该创建索引,尽量使用区分度高的字段创建索引,多条件组合查询优先创建组合索引,熟悉组合索引的最左前缀原则,不要创建冗余索引,禁止使用全文索引,可以用前缀索引进行替代,善于利用覆盖索引来优化查询,delete和update语句里面的where条件必须有索引,否则会导致锁表

十四、force index强制化 

MySQL查询优化器在执行sql语句时会选择它认为最合适的索引,但有时并不准确,不是实际上最快的索引,此时可以force index人为指定索引,force index跟着表名后面,用于强制指定的索引名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/154782.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

openGauss学习笔记-123 openGauss 数据库管理-设置账本数据库-账本数据库概述

文章目录 openGauss学习笔记-123 openGauss 数据库管理-设置账本数据库-账本数据库概述123.1 背景信息123.2 操作步骤 openGauss学习笔记-123 openGauss 数据库管理-设置账本数据库-账本数据库概述 123.1 背景信息 账本数据库融合了区块链思想,将用户操作记录至两…

js的File对象,Blob和file相互转换

示例 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1" /><title>js的File对象&#xff0c;Blob和file相互转换</title><…

EnlightenGAN 开源代码运行问题汇总

参考链接&#xff1a; EnlightenGAN 开源代码运行EnlightenGAN的运行环境搭建和训练自己的数据 源码下载和环境配置比较简单&#xff0c;本文测试环境&#xff1a;Win10 RTX3060、cuda 11.3、python 3.8 torch 1.12.0 numpy 1.20.1 如果想修改在项目里创建test_daatset文…

【OS】操作系统课程笔记 第八章 虚拟存储管理

8.1 虚拟存储器 8.1.1 虚拟存储器的定义 1. 虚存定义 通过请求调入功能和置换功能&#xff0c;能从逻辑上对内存容量加以扩充的一种存储器系统。 2. 优势和应用 用户地址空间可以大于物理内存空间&#xff0c;使得内存可以保存数量较多的进程&#xff0c;提高了并发性&…

leetcode刷题日记:125. Valid Palindrome(验证回文串)和136. Single Number(只出现一次的数字)

125.Valid Palindrome&#xff08;验证回文串&#xff09; 验证一个串之前我们需要对字符串进行处理将空格逗号什么的去掉&#xff0c;然后进行比较&#xff0c;比较的顺序如图所示: 在比较途中如果出现比较结果为假&#xff0c;就提前结束比较&#xff0c;此时我们可以判断这…

贪心 455.分发饼干

455.分发饼干 题目&#xff1a; 小朋友胃口值数组g[i]&#xff0c;饼干尺寸数组 s[j]&#xff0c;当饼干尺寸s[j]大于等于g[i]的时候&#xff0c;对应小朋友被满足&#xff0c;小朋友每一个最多一块饼干 &#xff0c;求给定条件下最多被满足的小朋友数量。 思路&#xff1a;…

Homography详解在MVSNet中的应用

Homography&#xff08;单应性变换&#xff09;是计算机视觉中的一个重要概念&#xff0c;用于描述两个平面之间的透视关系。在图像处理和计算机视觉中&#xff0c;Homography通常表示两个平面之间的投影关系&#xff0c;这种关系可以通过一个3x3的矩阵来表示。 在数学上&…

hive数仓-数据的质量管理

版本20231116 要理解数据的质量管理&#xff0c;应具备hive数据仓库的相关知识 文章目录 1.理解什么是数据的质量管理&#xff1a;2.数据质量管理的规划数据质量标准的分类 3.数据质量管理解决方案1.ods层的数据质量校验1&#xff09;首先在hive上建立一个仓库&#xff0c;添加…

实用篇-ES-RestClient查询文档

一、快速入门 上面的查询文档都是依赖kibana&#xff0c;在浏览器页面使用DSL语句去查询es&#xff0c;如何用java去查询es里面的文档(数据)呢 我们通过match_all查询来演示基本的API&#xff0c;注意下面演示的是 match_all查询&#xff0c;也叫基础查询 首先保证你已经做好了…

DTW(Dynamic Time Warping)算法学习应用实践与效率对比分析

DTW&#xff08;Dynamic Time Warping&#xff09;算法是一种用于度量两个时间序列之间的相似性的方法。它的构建原理如下&#xff1a; 基本思想&#xff1a;DTW算法通过计算两个时间序列之间的最小距离&#xff0c;来度量它们的相似性。与欧氏距离等传统距离度量方法不同&…

【文末送书——数学经典著作】工科必备的数学思维培养

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

elementplus DateTimePicker 日期范围选择器 设置默认时间范围为当前月的起始时间到结束时间

代码如下&#xff1a; <el-date-pickerv-model"value"type"datetimerange"start-placeholder"Start Date"end-placeholder"End Date":default-time"defaultTime" />const defaultTime: [Date, Date] [new Date(2000…

Ubuntu18.04安装ROS系统+turtle测试

安装 1.设置安装源 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list sudo sh -c . /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubun…

科技云报道:Citrix正式退出中国市场!国产们谁能真正顶上?

科技云报道原创。 2023年12月3日&#xff0c; Citrix&#xff08;思杰&#xff09;发布的公告将全面生效&#xff0c;中国市场&#xff08;包括香港地区和澳门地区&#xff09;也会停止所有新的交易。 这个消息&#xff0c;无疑是引起了业界的热议&#xff0c;毕竟Citrix可以…

【教3妹学编程-算法题】购买物品的最大开销

3妹&#xff1a;2哥&#xff0c;听说你今天发工资啦&#xff1f; 请我吃饭怎么样&#xff0c;嘿嘿 2哥 : 切&#xff0c;你上周还发工资了呢&#xff0c;也没见你请我吃饭。 3妹&#xff1a;哎呀&#xff0c; 我的工资都用来双11 shopping了&#xff0c; 双11过后我都吃了1周土…

Android Jetpack的组件介绍,常见组件解析

jetpack组件有哪些 Android Jetpack是一个集成Android应用程序组件的一站式解决方案。它使开发人员能够专注于他们的应用程序的真正创新部分&#xff0c;而不会受到Android平台特定的限制。Jetpack组件可分为四个类别&#xff1a; 架构组件&#xff08;Architecture Componen…

C++初阶-模板初阶

模板初阶 一、泛型编程二、函数模板2.1函数模板概念2.2函数模板格式2.3函数模板的原理2.4函数模板的原理2.5模板参数的匹配原则 三、类模板3.1类模板的定义格式3.2类模板的实例化 一、泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& …

IntelliJIDEA快捷键中文版

IntelliJIDEA快捷键中文版&#xff0c;对于Android Studio也适用。官方快捷键链接在此&#xff0c;官方上是英文的&#xff0c;我于2023-11-16下载并翻译成中文&#xff0c;可能翻译不太准&#xff0c;所以英文我都保留下来了&#xff0c;大家可以对比着看&#xff0c;有些英文…

Python语言:面向对象——类与对象初体验

什么是面向对象的编程思想&#xff1f; 我就知道他是一种编程思想&#xff0c;因资历尚浅&#xff0c;没有悟到面向对象的精髓和奥秘所在&#xff0c;只好援引一下chatgpt给我的答案了。 接下来到了分析类与对象的实质是什么了&#xff0c;这个我倒是知道&#xff0c;以下是我的…