【MySQL数据库笔记 - 进阶篇】(三)SQL优化

news2025/8/12 9:52:30

✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:暂定
📝视频地址:黑马程序员 MySQL数据库入门到精通
📣专栏定位:这个专栏我将会整理 B 站黑马程序员的 MySQL 入门课程的笔记,大家可以根据笔记辅助听课~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

三、SQL优化

1. 插入数据

insert优化

批量插入

insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');

手动提交事务

start transaction;
insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');
insert into tb_test values(4,'Tom'),(5,'Cat'),(6,'Jerry');
insert into tb_test values(7,'Tom'),(8,'Cat'),(9,'Jerry');
commit;

主键顺序插入

主键顺序插入性能高于乱序插入。

主键乱序插入:8  1  9  21  88  2  4  15  89  5  7  3
主键顺序插入:1  2  3  4  5  7  8  9  15  21  88  89

大批量插入数据

如果一次性需要插入大批量数据,使用 insert 语句插入性能较低,此时可以使用 MySQL 数据库提供的 load 指令进行插入。操作如下:

# 客户端连接服务端时,加上参数 --local-infile
mysql --local-infile -u root -p;
# 设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile = 1;
# 执行load指令将准备好的数据,加载到表结构中
load data local infile '/root/sql1.log' into table 'tb_user' fields terminated by ',' lines terminated by '\n';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8BUTQRe6-1668737809675)(数据库进阶篇.assets/image-20220827104526279.png)]

2. 主键优化

数据组织方式

InnoDB 存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pklz6k23-1668737809680)(数据库进阶篇.assets/image-20220827105003919.png)]

页分裂

页可以为空,也可以填充一半,也可以填充 100% 。每个页包含了 2-N 行数据(如果一行数据过大,会行溢出),根据主键排列。

主键顺序插入

每次页满了就会去开辟新的页,以此类推。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gsOu9G7d-1668737809691)(数据库进阶篇.assets/image-20220827105328352.png)]

主键乱序插入

看下面这个例子,如果插入 50 就发现不能直接开辟新的页插入到后面,因为其索引值在第一页和第二页之间。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ogMdpJDg-1668737809695)(数据库进阶篇.assets/image-20220827105452015.png)]

这就需要将要插入地方的那个页进行分裂,将一部分放到新开辟的那个页当中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LpPL2hNx-1668737809697)(数据库进阶篇.assets/image-20220827105645507.png)]

这样就有地方可以插入 50 了,即直接插入到第三页的后面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MXAUf29W-1668737809698)(数据库进阶篇.assets/image-20220827105739726.png)]

最后还需要调整一下顺序,现在第三页需要接到第一页的后面去。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UcCt4brF-1668737809700)(数据库进阶篇.assets/image-20220827105809761.png)]

页合并

当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q7zBN9za-1668737809702)(数据库进阶篇.assets/image-20220827110131698.png)]

当页中删除的记录达到 MERGE_THRESHOLD(默认为页的 50%),InnoDB 会开始寻找最靠近的页(前或后)看看是否可以将两个页合并以优化空间使用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hdqeiOQp-1668737809704)(数据库进阶篇.assets/image-20220827110145626.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C4kOG1Qn-1668737809706)(数据库进阶篇.assets/image-20220827110209529.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ie5A8wlt-1668737809707)(数据库进阶篇.assets/image-20220827110220197.png)]

注意: MERGE_THRESHOLD :合并页的阈值,可以自己设置,在创建表或者创建索引时指定。

主键的设计原则

  1. 满足业务需求的情况下,尽量降低主键的长度。
  2. 插入数据时,尽量选择顺序插入,选择使用 AUTO_INCREMENT 自增主键。
  3. 尽量不要使用使用 UUID 做主键或者是其它自然主键,如身份证号。
  4. 业务操作,避免对主键的修改。

3. order by优化

情况

(1)Using filesort :通过表的索引或全表扫描,读取满足条件的数据行,然后再排序缓冲区 sort buffer 中完成排序操作,所有不是通过索引直接返回排序结果的都叫 FileSort 排序。

(2)Using index :通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index ,不需要额外排序,操作效率高。

# 没有创建索引时,根据age,phone进行排序会显示Using filesort
explain select id,age,phone from tb_user order by age,phone;
# 创建索引
create index idx_user_age_phone_aa on tb_user(age,phone);
# 创建索引后,根据age,phone进行升序排序会显示Using index
explain select id,age,phone from tb_user order by age,phone;
# 创建索引后,根据age,phone进行降序排序会显示Using index
explain select id,age,phone from tb_user order by age desc,phone desc;

# 根据age,phone进行排序一个升序,一个降序会显示Using filesort
explain select id,age,phone from tb_user order by age asc,phone desc;
# 创建索引
create index idx_user_age_phone_ad on tb_user(age,asc,phone desc);
# 根据age,phone进行排序一个升序,一个降序会显示Using index
explain select id,age,phone from tb_user order by age asc,phone desc;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DBnjqAOw-1668737809708)(数据库进阶篇.assets/image-20220827112210212.png)]

总结

  1. 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。
  2. 尽量使用覆盖索引。
  3. 多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC
  4. 如果不可避免的出现 filesort ,大数据量排序时,可以适当增大排序缓冲区大小 sort_buffer_size(默认 256k)。

4. group by优化

在分组操作时,可以通过索引来提高效率。

分组操作时,索引的使用也是满足最左前缀法则的。

# 删除掉目前的联合索引idx_user_pro_age_sta
drop index idx_user_pro_age_sta on tb_user;
# 执行分组操作,根据profession字段分组
explain select profession,count(*) from tb_user group by profession;
# 创建索引
create index idx_user_pro_age_sta on tb_user(profession,age,status);
# 执行分组操作,根据profession字段分组
explain select profession,count(*) from tb_user group by profession;
# 执行分组操作,根据profession字段分组
explain select profession,count(*) from tb_user group by profession,age;

5. limit优化

一个常见又非常头疼的问题是 limit 2000000,10 ,此时需要 MySQL 排序前 2000010 的记录,仅仅返回 2000000 - 2000010 的记录,其他记录丢弃,查询排序的代价非常大。

优化思路: 一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化。

explain select * from tb_sku t,(select id from tb_sku order by id limit 2000000,10) a where t.id=a.id;

6. count优化

操作

explain select count(*) from tb_user;

MuISAM 引擎把一个表的总行数存放在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高。

InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累计计数。

优化思路: 自己计数。

count的几种用法

count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL ,累计值就加 1 ,否则不加,最后返回累计值。

用法: count(*)、count(主键)、count(字段)、count(1)

按照效率排序的话,count(字段) < count(主键id) < count(1) ≈ count(*) ,所以尽量使用 count(*)

7. update优化

尽量根据主键/索引字段进行数据更新。

update student set no='2000100100' where id=1;
update student set no='2000100105' where name='韦一笑';

InnoDB 的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode[剑指Offer54]二叉搜索树的第K大节点

难度&#xff1a;简单 题目&#xff1a; 给定一棵二叉搜索树&#xff0c;请找出其中第 k 大的节点的值。 示例 1: 输入: root [3,1,4,null,2], k 13/ \1 4\2 输出: 4 示例 2: 输入: root [5,3,6,2,4,null,null,1], k 35/ \3 6/ \2 4/1 输出: 4 限制&#xff1a; …

[附源码]java毕业设计旅游网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Nodejs编写接口

编写接口 1.自定义路由模块 const expressrequire(express) const routerexpress.Router()// 挂载对应的路由 router.get(/get,(req,res)>{// 通过req.query获取客户端通过查询字符串&#xff0c;发送到服务器的数据const queryreq.query// 调用res.send()方法&#xff0c…

集成学习-Bagging和Boosting算法

文章目录集成学习Bagging随机森林BostingAdaboostGBDTXGBoost集成学习 集成学习&#xff08;ensemble learning&#xff09;博采众家之长&#xff0c;通过构建并结合多个学习器来完成学习任务。“三个臭皮匠顶个诸葛亮”&#xff0c;一个学习器&#xff08;分类器、回归器&…

【微服务】SpringCloud微服务续约源码解析

目录 一、前言 二、客户端续约 1、入口 1.1、构造初始化 1.2、initScheduledTasks() 调度执行心跳任务 2、TimedSupervisorTask组件 2.1、构造初始化 2.2、TimedSupervisorTask#run()任务逻辑 3、心跳任务 3.1、HeartbeatThread私有内部类 3.2、发送心跳 3、发送心…

使用OpenAPI提升网关安全的开源软件,诚邀小伙伴参与

看过我博客的人都知道&#xff0c;我们是一家推广OpenAPI的企业。 OpenAPI是一种用于定义API结构的规范&#xff0c;在Java里我们可以使用swagger进行自动生成。其他语言也可以&#xff08;Golang等&#xff09;。通过这种对开发人员零成本的工具&#xff0c;我们可以高效的获…

典型的偏微分方程数值解法

马上要参加亚太杯啦&#xff0c;听说今年亚太杯有经典的物理题&#xff0c;没什么好说的&#xff0c;盘它&#xff01; 偏微分方程的数值解十分重要 椭圆型偏微分方程&#xff08;不含时&#xff09; 数值解法 二维拉普拉斯方程 例 边界条件 import numpy as np import mat…

教你如何使用云服务器搭建我的世界Minecraft服务器(超级简单-10分钟完成)

一个人玩游戏没啥意思&#xff0c;和朋友一块联机呢&#xff0c;距离太远&#xff0c;家庭局域网宽带又没有公网ip&#xff0c;你的朋友没办法与你联机&#xff0c;然而你只需要一台服务器即可搞定了&#xff1b;但是很多用户没没接触过相关的内容&#xff0c;具体的该怎么操作…

怎样做音乐相册怎样制作?手把手教你制作

大家平时出门游玩的时候&#xff0c;会拍摄一些好看的照片吗&#xff1f;那你们会将这些照片分享在社交平台上吗&#xff1f;普通的照片分享&#xff0c;有时会显得比较枯燥单调&#xff0c;其实我们可以将这些照片制作成音乐相册&#xff0c;这样就可以丰富照片的内容&#xf…

传输层-用户数据报协议(UDP)

UDP协议概述 用户数据报协议 UDP 是 Internet 传输层协议&#xff0c;提供无连接、不可靠、数据报尽力传输服务。 无连接&#xff1a;因此在支持两个进程间通信时&#xff0c;没有握手过程。不可靠&#xff1a;当应用进程将一个报文发送近 UDP 套接字时&#xff0c;UDP 并不能…

python+vue+elementui固定资产管理系统django mysql

目 录 摘 要 I ABSTRACT I 目 录 III 第1章 绪论 1 1.1开发背景 1 1.2开发意义 1 1.3研究内容 1 第2章 主要技术和工具介绍 3 前端技术&#xff1a;nodejsvueelementui 我们最初的项目结构由五个文件组成&#xff1a; manage.py&#xff1a;使用…

为什么管理类硕士(MBA/MEM/MPA)报考会成为职场人的香饽饽?

没个硕士学位&#xff0c;将来出门可能真的都不好意思打招呼了。近些天传言2023年考研人数达到接近550万的信息满天飞&#xff0c;无论真假&#xff0c;从目前已公布报考人数的院校来看&#xff0c;在去年的457万基础上再涨一波的几率是很大的。这其中&#xff0c;报考管理类、…

电科大离散数学-2-命题逻辑-1

目录 2.1 什么是命题 2.1.1 命题的定义 2.1.2 复合命题 2.2 命题联结词 2.2.1 否定联结词 2.2.2 合取联结词 2.2.3 析取联结词 2.2.4 蕴涵联结词 2.2.5 等价联结词 2.3 命题符号化及应用 2.3.1 命题连接词总结 2.3.2 命题联结词的优先级 2.3.3 命题联接词与开关电…

scala

Scala 概述 Scala是一门以Java虚拟机&#xff08;JVM&#xff09;为运行环境并将面向对象和函数式编程的最佳特性结合在一起的 静态类型编程语言&#xff08;静态语言需要提前编译的如&#xff1a;Java、c、c等&#xff0c;动态语言如&#xff1a;js&#xff09;。 Scala是一…

4-20mA转RS-485,Modbus数据采集模块 YL121

特点&#xff1a; ● 模拟信号采集&#xff0c;隔离转换 RS-485输出 ● 采用12位AD转换器&#xff0c;测量精度优于0.1% ● 通过RS-485接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压1000VDC ● 宽电源供电范围&#xff1a;8 ~ 32VDC ● 可靠性高&#xff0c;…

equals与==判断相等

一、 判断相等&#xff0c;判断的是物理地址相等。 二、equals 判断相等 equals 与hashCode 都是Object的方法。 所有的类都继承于Object&#xff0c;如果不重写equals。equals判断相等&#xff0c;底层也是使用来判断物理地址相等。 public boolean equals(Object obj) {re…

影响MySQL索引B+树高度的是什么?

提到MySQL&#xff0c;想必大多后端同学都不会陌生&#xff0c;提到B树&#xff0c;想必还是有很大部分都知道InnoDB引擎的索引实现&#xff0c;利用了B树的数据结构。 那InnoDB 的一棵B树可以存放多少行数据&#xff1f;它又有多高呢&#xff1f; 到底是哪些因素会对此造成影…

【软件测试】测试人的职责,我就是不当背锅侠......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试的目的&#xf…

基于机器视觉的移动消防机器人(四)--实验验证

本文素材来源于北方民族大学 机电工程学院 作者&#xff1a;牟义达、黄瑞翔、李涛 指导老师&#xff1a;田国禾、张春涛 1. 自主行走功能验证 实验目的&#xff1a;让机器人小车行驶500ms后停500ms&#xff0c;循环重复。 实验器材&#xff1a;计算机、消防机器人小车。 实…

ACM MM ECCV 2022 | 美团视觉8篇论文揭秘内容领域的智能科技

人工智能技术正在成为内容领域的中台力量&#xff0c;其中视觉AI已经渗透到内容生产、内容审核、内容分发、用户互动、商业化变现等各个环节。美团视觉智能部以场景化的内容产品、智能化的内容工具助力产业&#xff0c;在内容的创作、内容分发等环节应用广泛。 前不久&#xff…