MySQL学习笔记-进阶篇-SQL优化
SQL优化
插入数据
insert优化
-
1)批量插入
insert into tb_user values(1,'Tom'),(2,'Cat'),(3,'Jerry');
-
2)手动提交事务
mysql 默认是自动提交事务,这样会导致频繁的开启和提交事务,影响性能
start transaction
insert into tb_user values(1,'Tom'),(2,'Cat'),(3,'Jerry');
insert into tb_user values(4,'Tom'),(5,'Cat'),(6,'Jerry');
insert into tb_user 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
大批量插入数据
如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用mysql数据库提供的load指令进行插入,操作如下:
需要三步:
1、客户端连接服务端时,加上--local-infile
mysql --local-infile -u root -p
2、设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile=1;
3、执行load指令,将准备好的数据加载到表结构中。
load data local infile ‘地址(例如:/root/mysql1.sql)’ into table '表名称(例如:table_name)' fields terminated by ',' lines terminated by '\n'
主键优化
数据组织方式
在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(Index Orgnized Table IOT)
mysql的逻辑存储结构如下:
页分裂
页可以为空,也可以填充一半,也可以填充100%,每个页包含了2-n行数据(如果一行数据过大,会行溢出),根据主键排列。
主键顺序插入
主键乱序插入
主键乱序插入,会造成页分裂,应该尽量避免这种现象。
页合并
当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除,并且它的空间变得允许被其他记录声明使用。
当页中删除的数据超过MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后),看看是否可以将两格页合并以优化空间使用
小贴士:
MERGE_THRESHOLD:合并页的阈值,可以自己设置,在创建表或创建索引时指定。
⭐️主键设计原则:
满足业务需求的情况下,尽量降低主键长度。(因为二级索引的页节点存储的是主键)
插入数据时,尽量选择顺序插入,选择AUTO_INCREMET的自增主键。
尽量不要使用UUID做主键或者其他自然主键做主键,例如身份证号。
业务操作时,尽量避免对主键的修改。
order by 优化
order by的查询计划中Extra有两种:
排序分类
Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中进行排序操作,所有不是通过索引直接返回排序结果的排序,都叫FileSort排序。
Using index:通过有序索引扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率高
演示
没有创建索引时,根据age、phone进行排序
explain select id,age,phone from tb_user order by age,phone;
创建索引,排序方式是asc默认,可以省略
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进行降序排序,走索引,backward index scan;using index
explain select id,age,phone from tb_user order by age desc,phone desc;
根据age、phone进行排序,一个升序,一个降序
explain select id,age,phone from tb_user order by age asc,phone desc;
创建索引
create index idx_user_age_phone_sd 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;
order by优化原则
根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则;
尽量使用覆盖索引;
多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)
如果不可避免的出现了filesort大数据量排序的时候,可以适当增大排序缓冲区大小sort_buffer_size(默认是256K)
group by 优化
演示
优化原则
在分组操作时,可以通过索引提高效率;
分组操作时,索引的使用也是满足最左前缀法则;
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
count 优化
explain select count(*) from tb_sku;
count的快慢是有存储引擎决定的
MyISAM把一个表的数据总行数存在了磁盘上,因此执行count(*)的时候直接返回这个数,效率很高;
InnoDB引存储擎就麻烦了,它执行count(*)的时候,需要把数据一行一行的从引擎里读出来,然后累积计数;
优化思路:自己计数
例如存入redis
count的几种用法
count()是一个聚合函数,对于返回的结果集,一行一行的判断,如果count函数的参数不是null,累计值就加1,否则不加,最后返回累计值。
用法:count(*)、count(主键)、count(字段)、count(1)
效率
count(字段)<count(主键)<count(1)≈count(*)
所以尽量使用count(*)
update优化
演示
行级锁
表级锁
InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁
优化原则:
尽量使用行级锁,避免表级锁;
更新条件使用索引,加的锁是行锁;
索引失效,导致行锁升级表锁;
总结
相关文章:

MySQL学习笔记-进阶篇-SQL优化
SQL优化 插入数据 insert优化 1)批量插入 insert into tb_user values(1,Tom),(2,Cat),(3,Jerry); 2)手动提交事务 mysql 默认是自动提交事务,这样会导致频繁的开启和提交事务,影响性能 start transaction insert into tb_us…...

【机器学习】第2章 线性回归及最大熵模型
一、概念 1.回归就是用一条曲线对数据点进行拟合,该曲线称为最佳拟合曲线,这个拟合过程称为回归。 2.一个自变量 叫 一元线性回归,大于一个自变量 叫 多元线性回归。 (1)多元回归:两个x,一个…...
科技创新对农业发展的影响
科技创新对农业发展的影响深远且广泛,主要体现在以下几个方面: 一、提高农业生产效率 引入先进的农业机械设备:新型农业机械设备如无人机、机器人等的应用,显著减轻了农民的劳动强度,提高了农作物的种植效率。利用精…...
Linux 常用命令 - rm 【删除文件或目录】
简介 rm 命令源于英文单词 “remove”,它用于删除文件或目录。rm 是 Linux 系统中最基本的命令之一,用于删除指定的文件或目录。默认情况下,rm 不会删除目录,但可以通过递归删除选项来实现。 使用方式 rm [选项]... [文件]...常…...
一血c++
题目描述 每一个竞赛选手都无法拒绝拿一血 "一血"其实就是同学们在榜单上看到的深绿色的标记,代表着某道题目,他是第一个通过的。 叶苡朋老师是一名资深信奥选手,在大学多次获奖,也是一个资深抢一血爱好者࿰…...

无问芯穹Qllm-Eval:制作多模型、多参数、多维度的量化方案
前言 近年来,大语言模型(Large Models, LLMs)受到学术界和工业界的广泛关注,得益于其在各种语言生成任务上的出色表现,大语言模型推动了各种人工智能应用(例如ChatGPT、Copilot等)的发展。然而…...

2024-05-31T08:36:09.000+00:00 转换 YYYY-MM-DD HH-MM-SS
function formatDate(date) {// 处理ISO 8601字符串if (typeof date string) {date new Date(date);}// 处理时间戳else if (typeof date number) {date new Date(date * 1000); // 假设后端时间戳为秒,需要乘以1000转换为毫秒}// 自定义格式化,例如…...

reason: the Java file contained parse errors
今天用Maven打包项目时发生一个错误: file: D:\workspace\echoo2.0-xxx-xxx-portal\src\main\java\com\echoo\service\impl\DecDataServiceImpl.java; reason: the Java file contained parse errors 打包报错显示这个类解析错误 在IDEA中没有任何错误提示 问题所…...

使用密钥对登录服务器
目录 1、使用密钥文件登录服务器 2、登录成功画面: 3、如若出现以下状况,则说明密钥文件登录失败 1、使用密钥文件登录服务器 首先需要上传pem文件 2、登录成功画面: 3、如若出现以下状况,则说明密钥文件登录失败 解决方法&…...
面试_多线程
线程池 线程池的参数有哪些 线程池七大参数分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler corePoolSize:线程池中常驻核心线程数maximumPoolSize:线程池能够容纳同时执行的最大线程数keepAliveTime&…...

跨境电商必备?揭秘原生IP的作用
一、什么是原生IP? 原生IP(Native IP)是指由互联网服务提供商(ISP)或服务器提供商直接分配给用户的IP地址,这种IP地址直接与用户设备或网络相连,也就是指这个IP的注册地址和服务器机房所在的国…...
mysql竖表变横表不含聚合
文章目录 前言一、vertical_table二、转换1.要将其转换为横表形式,例如:2.sql 总结 前言 在MySQL中将竖表转换为横表(也称为行转列操作),不涉及聚合函数,通常可以通过使用条件判断和自连接来实现。假设有一…...

application/x-www-form-urlencoded和json的区别
application/x-www-form-urlencoded 和 application/json 是两种不同的数据格式,常用于HTTP请求中传递数据。 它们各自的特点和使用场景如下: 1. application/x-www-form-urlencoded •特点:这是一种传统的表单提交时采用的编码类型&#x…...

oracle数据库日常保养或巡检语句实践整理汇总
目录 1.目的 2.操作工具 3.实践说明 1.检查Oracle实例状态 2.检查Oracle在线日志状态 3.检查Oracle表空间状态 4.检查Oracle所有数据文件状态 5.检查Oracle数据库连接情况 6.检查Oracle表容量占用大小 7.检查Oracle备份 8.检查数据库表空间的使用情况 4.总结 1.目的 …...
Elasticsearch 第一期:基础的基础概念
前言 Elasticsearch(弹性搜索) ,简称为ES, 它是一个开源的高扩展的分布式全文检索引擎,它提供的功能主要分为:实时存储,实时分析搜索;本身扩展性很好,可以扩展到上百台服…...

MySQL数据库笔记(二)
第一章 单行函数 1.1 什么是函数 函数的作用是把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了代码效率,又提高了可维护性。在SQL中使用函数,极大地提高了用户对数据库的管理效率。 1.2 定义 操作数据对象。 接受参数返回一个结果。 只对一行进行…...
谷歌邮箱:2024年最全使用指南及技巧
注册谷歌邮箱时遇到麻烦了吗?收件箱乱得让人头疼,找不到提升效率的方法?或者是在处理多个谷歌邮箱账户时感到手忙脚乱? 掌握Gmail邮箱的使用技巧是每个外贸人员都必须学会的,本文将提供一个实用的谷歌邮箱注册和使用指…...
工业设计初学者手册——第四部分:制造工艺
工业设计初学者手册 文章目录 工业设计初学者手册第四部分:制造工艺7. 常见制造工艺介绍7.1 传统制造工艺7.2 现代制造工艺 8. 材料选择与应用8.1 材料的基本分类与特性8.2 材料选择的原则8.3 环保材料的应用 总结 第四部分:制造工艺 7. 常见制造工艺介…...

Scala语言:大数据开发的未来之星 - 零基础到精通入门指南
前言 随着大数据时代的到来,数据量的急剧增长为软件开发带来了新的挑战和机遇。Scala语言因其函数式编程和面向对象的特性,以及与Apache Spark的完美协作,在大数据开发领域迅速崛起,成为该领域的新兴宠儿。本篇将从零基础开始&…...

Springboot整合Zookeeper分布式组件实例
一、Zookeeper概述 1.1 Zookeeper的定义 Zookeeper是一个开源的分布式协调服务,主要用于分布式应用程序中的协调管理。它由Apache软件基金会维护,是Hadoop生态系统中的重要成员。Zookeeper提供了一个高效且可靠的分布式锁服务,以及群集管理…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...