【第九章 SQL优化_插入数据,主键优化,order by优化】

news2024/10/5 19:19:24

第九章 SQL优化_插入数据,主键优化,order by优化

1.插入数据:
(1)insert:

1)批量插入数据:
Insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');2)手动控制事务:
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;3)主键顺序插入,性能要高于乱序插入:
主键乱序插入 : 8 1 9 21 88 2 4 15 89 5 7 3
主键顺序插入 : 1 2 3 4 5 7 8 9 15 21 88 89

(2)大批量插入数据:
如果一次性需要插入大批量数据(比如: 几百万的记录),使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。
可以执行如下指令,将数据脚本文件中的数据加载到表结构中:

1)客户端连接服务端时,加上参数 -local-infile
mysql –-local-infile -u root -p
(2)设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
#(select @@local_infile;为查看开关是否开启,0表示未开启)
set global local_infile = 1;3)执行load指令将准备好的数据,加载到表结构中
#'/root/sql1.log'为本地文件目录,','为每个字段的分隔符, '\n'为每行分隔符。
load data local infile '/root/sql1.log' into table tb_user fields terminated by ',' lines terminated by '\n' ;

2.主键优化:
(1)数据组织方式:
在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT)。
在这里插入图片描述行数据,都是存储在聚集索引的叶子节点上的。InnoDB的逻辑结构图如下:
在这里插入图片描述在InnoDB引擎中,数据行是记录在逻辑结构 page 页中的,而每一个页的大小是固定的,默认16K。那也就意味着, 一个页中所存储的行也是有限的,如果插入的数据行row在该页存储不小,将会存储到下一个页中,页与页之间会通过指针连接。
(2)页分裂:
页可以为空,也可以填充一半,也可以填充100%。(每个页至少包含两行数据)每个页包含了2-N行数据(如果一行数据过大,会行溢出),根据主键排列。
A. 主键顺序插入效果:
① 从磁盘中申请页, 主键顺序插入
②第一个页没有满,继续往第一页插入
在这里插入图片描述
③当第一个也写满之后,再写入第二个页,页与页之间会通过指针连接
在这里插入图片描述
④当第二页写满了,再往第三页写入
在这里插入图片描述B.主键乱序插入效果:
①加入1#,2#页都已经写满了,存放了如图所示的数据
在这里插入图片描述
②此时再插入id为50的记录,我们来看看会发生什么现象
在这里插入图片描述
按照顺序,应该存储在47之后。
在这里插入图片描述
但是47所在的1#页,已经写满了,存储不了50对应的数据了, 那么此时会开辟一个新的页 3#。
在这里插入图片描述
但是并不会直接将50存入3#页,而是会将1#页后一半的数据,移动到3#页,然后在3#页,插入50。
在这里插入图片描述
移动数据,并插入id为50的数据之后,那么此时,这三个页之间的数据顺序是有问题的。 1#的下一个页,应该是3#, 3#的下一个页是2#。 此时,需要重新设置链表指针。
在这里插入图片描述(3) 页合并:
目前表中已有数据的索引结构(叶子节点)如下:
在这里插入图片描述
当我们对已有数据进行删除时,具体的效果如下:
当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。
在这里插入图片描述
当页中删除的记录达到 MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后)看看是否可以将两个页合并以优化空间使用。
在这里插入图片描述
删除数据,并将页合并之后,再次插入新的数据21,则直接插入3#页。
在这里插入图片描述MERGE_THRESHOLD:合并页的阈值,可以自己设置,在创建表或者创建索引时指定。
(4)索引设计原则:
①满足业务需求的情况下,尽量降低主键的长度。
②插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键。
③尽量不要使用UUID做主键或者是其他自然主键,如身份证号。
④业务操作时,避免对主键的修改。
3.order by优化:
①Using filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。
②Using index : 通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要
额外排序,操作效率高。
Using index的性能高,Using filesort的性能低,在优化排序操作时,尽量要优化为 Using index。
A.数据准备:
在这里插入图片描述B.执行排序SQL:

explain select id,age,phone from tb_user order by age ;
explain select id,age,phone from tb_user order by age, phone ;

在这里插入图片描述由于 age, phone 都没有索引,所以此时再排序时,出现Using filesort, 排序性能较低。
C.创建索引

create index idx_user_age_phone_aa on tb_user(age,phone);

D.创建索引后,根据age, phone进行升序排序

explain select id,age,phone from tb_user order by age;

在这里插入图片描述建立索引之后,再次进行排序查询,由原来的Using filesort, 变为了 Using index,性能比较高。
E.创建索引后,根据age, phone进行降序排序

explain select id,age,phone from tb_user order by age desc , phone desc;

在这里插入图片描述但是此时Extra中出现了 Backward index scan,这个代表反向扫描索引,在MySQL中的索引,默认索引的叶子节点是从小到大排序的,
F.根据phone,age进行升序排序,phone在前,age在后;

explain select id,age,phone from tb_user order by phone , age;

在这里插入图片描述排序时,也需要满足最左前缀法则,否则也会出现 filesort。
G.根据age, phone进行降序一个升序,一个降序

explain select id,age,phone from tb_user order by age asc , phone desc ;

在这里插入图片描述因为创建索引时,如果未指定顺序,默认都是按照升序排序的,而查询时,一个升序,一个降序,此时就会出现Using filesort。
H.创建联合索引(age 升序排序,phone 倒序排序),再次执行如下SQL。

create index idx_user_age_phone_ad on tb_user(age asc ,phone desc);
explain select id,age,phone from tb_user order by age asc , phone desc ;

在这里插入图片描述order by优化原则:
①根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。
②尽量使用覆盖索引。
③多字段排序, 一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)。
④如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区大小sort_buffer_size(默认256k)。

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

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

相关文章

PyTorch(五)神经网络基础

文章目录Log一、Containers 基本骨架1. Module2. Sequential二、 Convolution Layers 卷积层1. torch.nn.functional① Conv2d2. torch.nn① Conv2d三、Pooling layers 池化层1. nn.MaxPool2d 下采样(最大池化)四、Non-linear Activations 非线性激活1. …

2022CCSP T1最少充电次数

记录第一次CCSP竞赛。一共3题,只做出第一题,用时3h30m(累),ac了开心地吃了个午饭。然而饭饱之后,大脑完全提不起神看着题面昏昏欲睡。第二题是虚拟内存,超级大模拟,刚好这个学期学os…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java流浪动物救助网站a1wsz

毕业设计也不需要做多高端的程序,毕业设计对于大多数同学来说,为什么感觉到难,最重要的一个原因,那就是理论课到实践课的转变,很多人一下不适应,本能开始拒绝,如果是一个考试,大家都…

ITU、MCC和MNC介绍以及China运营商对照表

相关概念 ITU 国际电信联盟是联合国负责信息通信技术(ICT)事务的专门机构。 国际电联成立于1865年,为了促进国际上通信网络的互联互通。他们进行全球无线电频谱和卫星轨道的划分,制定技术标准以确保实现网络和技术的无缝互连&…

【Docker】30条Docker常用命令图文举例总结

本期目录1. 帮助启动类命令2. 镜像命令2.1 列出镜像2.2 搜索远程库镜像2.3 拉取镜像2.4 查看所占空间2.5 删除镜像2.6 面试题3. 容器命令3.1 新建启动容器1)启动交互式容器3.2 列出当前所有正在运行的容器3.3 退出容器3.4 启动已停止的容器3.5 重启容器3.6 停止容器…

第六章 映射:Mappings

文章目录1、Mapping 简介1.1 mapping 是啥?1.2 如何查看索引映射2、自动映射:dynamic mapping2.1 自动类型推断规则2.2 mapping 的使用禁忌2.3 自动映射器的意义是什么?3、手动映射:Explicit mapping3.1 创建索引的 mapping3.2 修…

电子产品量产工具项目开发中遇到的问题(更新......)

1、找不到tslib.h库的头文件 这是因为找不到tslib库的头文件。 确定工具链中头文件、库文件目录,对于 IMX6ULL ,命令如下 echo main(){}| arm-linux-gnueabihf-gcc -E -v -找到了编译器arm-linux-gnueabihf的include和lib文件夹 /usr/local/arm/gcc-l…

AT155 高压绝缘电阻测试仪 都有哪些功能?

、 高压绝缘电阻测试仪是—款手持式仪表主要用来测量交流/直流电压、 电阻、 短路蜂鸣测试和 绝缘电阻测量。 式高压绝缘电阻测试仪具有4个量程用千绝缘电阻、 AC/DC电压、 电阻和短路蜂鸣测试。 设计达到以下安全标准 .绝缘测试量程O.lMn to 60Gn。…

机器学习 决策树基础 ID3、C4.5、CART

文章目录参考决策树指标基尼系数基础公式公式理解引入划分后的公式划分后公式的理解信息熵、信息增益如何理解信息熵两种指标的对比划分策略ID3定义举例计算各属性的信息增益选取最优属性作划分对子节点作递归划分生成结果ID3的缺点C4.5信息增益率优化缺点CARTCART相较于前两者…

Windows下使用C语言创建定时器并周期和网络调试助手通信

在Windows C下采用timeSetEvent函数来设置定时器 关于timeSetEvent的函数原型及注释如下所示: MMRESULT timeSetEvent(UINT uDelay, // 定时事件的触发周期,单位为毫秒UINT uResolution, // 定时事件的精度,单位…

161-183-mysql-高级篇-事务-锁-mvcc

116-mysql-事务篇-锁: 推荐网站 mysql学习网站:https://www.bilibili.com/video/BV1iq4y1u7vj?p109&vd_source39a1ba1654411bc9ab90f6f2926600b7 mysql:https://dev.mysql.com/doc/refman/8.0/en/ 算法:https://www.cs.us…

我看世界杯——来自一个“假”球迷视角

世界杯还有一个星期就要结束了,说实话,我之前是一场球都没有,对足球知道也甚少,妥妥一个假球迷了。这次世界杯感觉离自己特别近,身边的很多朋友都在看,也不乏赌球的小伙伴,自己的感悟也比较深&a…

电机定子模态的空间特征

对于电机定子模态而言,通常不是按传统的阶次顺序(按频率从小到大)来描述它们,而是按空间节点数的顺序来描述,这在很大程度上是因为受激励的电磁力波的振型的影响。 1、传统模态阶次表示方式 传统模态阶次的顺序都是按…

安卓期末大作业——个人简历APP源码和设计报告

Android课程需求文档 设计题目: 个人简历APP 学生姓名: 学号: 1.Smart.apk功能设计说明 Android真机运行进入该app。背景音乐服务播放正常,并设置可通过右上角按钮关闭musicservice; 1通过viewpager实…

Jenkins+SonarQube 代码质量检测详解

一、SonarQube 概述 1、SonarQube 简介 Sonar Qube是一个开源的代码分析平台,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。 Sonar Qube通过插件机制,Sonar可以集成不同的测试工具,代码分析工具…

【JavaWeb开发-Servlet】将项目打包部署在本地

Servlet与JSP进阶十:Web应用程序打包与发布(war包)_小枯林的博客-CSDN博客_servlet项目如何打成war包本篇博客主要内容是: ●如何使用Eclipse打war包; ●打好的war包如何发布;访问演示; ●解决u…

如何使用ChatGPT辅助AI绘画?

如何使用ChatGPT辅助AI绘画? AI自动化内容生成(AIGC)是一种利用人工智能技术生成新内容的方法。它可以快速、自动、准确地从大量原始数据中生成新内容,大大提高了内容创作效率。AIGC 使用机器学习算法,自动识别文本特…

【MySQL】触发器

目录 概述 操作-创建触发器 操作-NEW与OLD 其他操作 注意事项 概述 介绍 触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据 库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据执…

微信小程序|前端技术主要框架分析

1.框架 微信提供了一套自己的用于开发小程序的前端框架,和目前主流的前端框架相比,其既有类似的地方,也有特殊的地方。 特殊的地方在于其只能在微信小程序开发工具内使用,并做了相对严格的使用和配置限制,开发者必须按照其规定的用法来使用。一些外部的框架和插件在小程…

apis-day7综合案例

apis-day7综合案例-小兔鲜案例注册 需求①: 发送验证码 用户点击之后,显示 05秒后重新获取 时间到了,自动改为 重新获取 需求②: 用户名验证(注意封装函数 verifyxxx) 正则 /1{6,10}$/ 如果不符合要求…