⑩③【MySQL】详解SQL优化

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~
SQL优化
- ⑩③【MySQL】了解并掌握SQL优化
- 1. 插入数据 优化
- 2. 主键优化
- 3. order by 排序优化
- 4. group by 分组优化
- 5. limit 分页优化
- 6. count 优化
- 7. update 更新优化
⑩③【MySQL】了解并掌握SQL优化
1. 插入数据 优化
insert优化:
- ⚪使用批量插入
-
-
- ⚪手动提交事务(每次SQL语句执行后事务自动提交,手动提交避免了多次提交,提升效率)
-
-
- ⚪使用主键顺序插入(顺序比乱序速度更快,性能更高)
-
-
大批量插入数据:
如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。操作如下:
# (命令行)客户端连接数据库时,加上参数: --local-infile
mysql --local-infile -u root -p
-- 查看从本地加载文件导入数据的开关是否开启
select @@local_infile;-- 设置全局参数local_infile为1,表示开启从本地加载文件导入数据的开关。
set global local_infile=1;-- 执行load指令将准备好的数据,加载到表结构中
-- 加载文件: /root/sql.log 中的数据插入表
-- 字段间使用 逗号',' 分隔
-- 行间使用 换行'\n' 分隔
load data local infile '/root/sql.log' into table `表名` fields terminated by ',' lines terminated by '\n';
2. 主键优化
数据组织方式:
- 在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table 简称
IOT)。
页分裂:
-
页可以为空,也可以填充一半,也可以填充100%。每个页包含了至少2行数据(如果一行数据多大,会行溢出),根据主键排列。
-

分裂后插入↓

重新设置指针↓

页合并:
-
当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。
-
当页中删除的记录达到MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后)看看是否可以将两个页合并以优化空间使用。
-

合并↓

主键设计原则:
- 主键设计原则:
-
- ①在满足业务需求的情况下,尽量降低主键的长度。
- ②插入数据时,尽量选择顺序插入,选择使用
AUTO_INCREMENT自增主键。 - ③尽量不要使用UUID做为主键或者作为其他自然主键,如身份证号。
- ④在业务操作时,尽量避免对主键的修改。
3. order by 排序优化
order by 优化:
①. Using filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort排序。
②. Using index : 通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,.不需要额外排序,操作效率高。
排序效率:Using index > Using filesort
-
order by优化策略:
-
-
①根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。
-
-
-- 没有建立索引时,排序性能为:`Using filesort` explain select id,age,phone from tb_user order by age,phone;-- 为排序字段建立合适索引 create index idx_age_phone_aa on tb_user(age,phone); -- 等价于: create index idx_age_phone_aa on tb_user(age asc,phone asc); -- 建立索引后,排序性能提升为:`Using index`
-
-
②尽量使用覆盖索引,非覆盖索引需要回表查询,会从Using index 变为 Using filesort。
-
③多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC\DESC)。
-
-
-- 一个升序一个降序 select id,age,phone from tb_user order by age asc,phone desc;-- 注意联合索引在创建时的规则 create index idx_age_phone_ad on tb_user(age asc,phone desc);
-
-
④如果不可避免地出现filesort,大数据量排序时,可以适当增大排序缓冲区
sort_buffer_size的大小(默认256k)。 -
-
-- 查看参数sort_buffer_size大小 show variables like 'sort_buffer_size';-- 设置参数sort_buffer_size大小 set sort_buffer_size=自定义的大小;
-
-
4. group by 分组优化
-
根据分组字段建立合适的索引来提高效率。
-
分组操作时,多字段通过联合索引排序也是遵循最左前缀法则的。
-
-
-- 如何建立合适索引:建议使用联合索引,可参考上文的order by优化
-
5. limit 分页优化
一个常见又非常头疼的问题就是大数据量的分页,如:limit2000000,10,此时需要MySQL排序前2000010记录,仅仅返回2000000到2000010的记录,其他记录丢弃,查询排序的代价非常大。
-
优化策略: -
-
一般分页查询时,通过建立
覆盖索引能够较好提升性能,可通过覆盖索引+子查询形式进行优化。 -
-- 优化前: select * from tb_sku limit 2000000,10;-- 优化后 -- 子查询的id字段存在主键索引,order by性能得到优化 -- 根据子查询的到的主键字段id进行查询,效率高。 select s.* from tb_sku s,(select id from tb_sku order by id limit 2000000,10) i where s.id = i.id;
-
6. count 优化
count():
- count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count()函数的参数不是NULL,累计值就加1,否则不加,最后返回累计值。(只记录不为NULL的记录)
- **用法:**count(*)、count(主键)、count(字段)、count(1)
-
- ①
count(*) -
- InnoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。
- ②
count(主键) -
- InnoDB引擎会遍历整张表,把每一行的主键id值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为NULL)。
- ③
count(字段) -
- **没有not null约束:**InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。
- **有not null约束:**InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加。
- ④
count(1) -
- lnnoDB引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加。
- ①

7. update 更新优化
需要优化的问题:
- InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,更新没有索引的记录或索引失效,使用的锁会从行锁变为表锁。
- 使用表锁会使并发性能下降,所以应当经可能去更新 使用了索引的字段。

相关文章:
⑩③【MySQL】详解SQL优化
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ SQL优化 ⑩③【MySQL】了解并掌握SQL优化1. 插…...
SQL 的 AND、OR 和 NOT 运算符:条件筛选的高级用法
AND 运算符 SQL的AND运算符用于根据多个条件筛选记录,确保所有条件都为TRUE才返回记录。下面是AND运算符的基本语法: SELECT column1, column2, ... FROM table_name WHERE condition1 AND condition2 AND condition3 ...;column1, column2,等是您要选…...
11.5MyBatis(进阶)
一.${}和#{} 1.$是直接替换,#是预处理(使用占位符,替换成?).前者不安全(SQL注入), 后者安全. 2.$的使用场景: 如果传递的值是sql的关键字,只能使用$,不能使用#(asc,desc). 二.SQL注入 注意: 如果使用${}进行传参,一定要是可以穷举的,并且要进行安全性验证(例如排序,只能传a…...
CentOS挂载:解锁文件系统的力量
目录 引言1 挂载简介2 挂载本地分区3 挂载网络共享文件系统4 使用CIFS挂载结论 引言 在CentOS(一种基于Linux的操作系统)上挂载文件系统是一项常见而重要的任务,无论是将新的磁盘驱动器添加到系统,还是挂载网络共享资源ÿ…...
修身养性 - 阿纳托利: 健身指导
欢迎来到我的力量建设培训计划。这是一个介绍性视频,我会对训练项目、技巧和计划进行解释。我每天都在练习英语,但还不够好,所以下面使用了自动翻译。带来不便请原谅。 Welcome to my power building training program. Its an introduction video where I explained about …...
pip anaconda 设置 国内镜像源
一、pip设置国内(清华)镜像源和升级pip 使用下面的命令直接使用清华镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simplepython -m pip install --upgrade pip #备选 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&am…...
三江城115m²3室2厅2卫,现代简约不单是居所更是对生活的向往。福州中宅装饰,福州装修
【前言】 简洁有力,静默无声。 以简约精致的方式,展现现代都市生活; 经典不因潮流褪色,不为悦人只为悦己。 项目信息 项目名称 | 三江城 设计地址 | 福建福州 项目面积 | 115㎡ 项目户型 | 3室2厅 设计风格 | 现代简约 全…...
Hangfire.Pro 3.0 Crack
Hangfire.Pro 有限的存储支持 Hangfire Pro 是一组扩展包,允许使用批处理创建复杂的后台作业工作流程,并提供对超快速Redis作为作业存储的支持 请注意,仅在使用Hangfire.SqlServer、Hangfire.Pro.Redis或Hangfire.InMemory包作为作业存储时才…...
axios的使用,cancelToken取消请求
get请求 // 为给定 ID 的 user 创建请求 axios.get("/user?ID12345").then(function (response) {console.log(response);}).catch(function (error) {console.log(error);}); // 上面的请求也可以这样做 axios.get("/user", {params: {ID: 12345,},}).t…...
Rockdb简介
背景 最近在使用flink的过程中,由于要存储的状态很大,所以使用到了rockdb作为flink的后端存储,本文就来简单看下rockdb的架构设计 Rockdb设计 Rockdb采用了LSM的结构,它和hbase很像,不过严格的说,基于LS…...
【MyBatis】写了 10 年的代码,我最怕写 MyBatis 这些配置,现在有详解了
在使用 mybatis 过程中,当手写 JavaBean和XML 写的越来越多的时候,就越来越容意出错。这种重复性的工作,我们当然不希望做那么多。 还好, mybatis 为我们提供了强大的代码生成--MybatisGenerator。 通过简单的配置,我们…...
全球地表水数据集JRC Global Surface Water Mapping Layers v1.4
简介: JRC Global Surface Water Mapping Layers产品,是利用1984至2020年获取的landsat5、landsat7和landsat8的卫星影像,生成分辨率为30米的一套全球地表水覆盖的地图集。用户可以在全球尺度上按地区回溯某个时间上地表水分的变化情况。产品…...
Spring过滤器和拦截器的区别
📑前言 本文主要Spring过滤器和拦截器的区别的问题,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日一句&#x…...
HIS医疗项目
文章目录 医疗项目简介HIS项目介绍HIS架构解析HIS业务流程图HIS项目架构图 HIS组件解析——服务支撑 内存设置为4G或以上部署NGINX服务部署web安装JDK部署Elasticsearch安装ik中文分词器 部署rabbitmq部署MySQL服务安装MySQL服务建库、授权用户导入数据 部署Redis测试Redis 部署…...
eclipse启动无法找到类(自定义监听器)
一.报错 二.排查 1.首先检查代码是否有问题 本人报错是找不到监听器,故检查监听器的代码和web.xml文件是否有问题 public class DoorListener implements ServletContextListener 监听器是否继承并实现ServletContextListener中的方法。 web.xml中: &…...
Ubuntu openssh-server 离线安装
经常用到ubunutu 20.04容器,但是没有ssh比较难调试代码,离线环境下安装方法: 安装以下三个软件包,点击openssh下载链接可下载: 1、openssh-client_8.2p1-4_amd64.deb 2、openssh-sftp-server_8.2p1-4_amd64.deb 3、…...
servlet页面以及控制台输出中文乱码
如图: servlet首页面: servlet映射页面: 以及控制台输出打印信息: 以上页面均出现中文乱码 下面依次解决: 1、首页面中文乱码 检查你的html或者jsp页面中meta字符集 如图设置成utf-8 然后重启一下tomcat 2、servl…...
《向量数据库指南》——TruLens + Milvus Cloud构建RAG深入了解性能
深入了解性能 索引类型 本例中,索引类型对查询速度、token 用量或评估没有明显影响。这可能是因为数据量较小的关系。索引类型对较大语料库可能更重要。 Embedding 模型 text-embedding-ada-002 在准确性(0.72,平均 0.60)和答案相关度(0.82,平均0.62)上优于 MiniLM Embeddin…...
vscode代码上传到gitlab
打开终端 1.1输入一下内容提交到本地仓库 PS D:\VueProject2\mall-admin-web> git add . PS D:\VueProject2\mall-admin-web> git commit -m “商品优化,屏蔽不要内容” 1.2提交到远程仓库 master应该被替换为 Gitee 仓库中默认的分支名称 PS D:\VueProje…...
Spring Boot 项目的常用注解与依赖
工具类 lombok 依赖 可以快速的为类提供 get,set,toString 等方法 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency> My…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...




