【MySQL进阶篇】SQL优化

1、插入数据

· insert优化

        批量插入:

insert into tb_user values(1,'tom'),(2,'cat'),(3,'jerry');

 如果插入数据过大,可以将业务分割为多条insert语句进行插入。

        手动提交事务:

start transaction;

insert into tb_user values(1,'tom'),(2,'cat'),(3,'jerry');

insert into tb_user values(4,'tom'),(5,'cat'),(6   ,'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

取决于MySQL的数据组织结构,主键顺序插入的性能要优于主键乱序插入。

 · 大批量插入数据

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

#客户端连接服务端时,加上参数 - local-infile

mysql --local-infile -u -p

#设置全局参数local_file为1,开启从本地加载文件导入数据的开关

set global local_infile=1;

#执行load指令将准备好的数据,加载到表结构中

load data local infile '/root/sql1.log' into table 'tb_user' fileds terminated by ',' lines terminated by '/n'

 select @@local_infile;
+----------------+
| @@local_infile |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)set global local_infile=1;
Query OK, 0 rows affected (0.00 sec)

2、主键优化

· 数据组织方式

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

· 页分裂

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

页分裂 

· 页合并

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

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

· 主键的设计原则

1、满足业务需求的情况下,尽量降低主键长度(如果主键较长,二级索引比较多,会占用大量磁盘空间,在搜索时耗费大量磁盘IO)。

2、插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键。

3、尽量不要使用UUID做主键或其他自然主键,如身份证号。(每一次生成的UUID是无序的,插入时可能出现乱序,从而导致页分裂)

4、业务操作时,避免对主键的修改。 

3、order by优化

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

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

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

 可以看到额外信息显示的是Using filesort,效率相对较低。需要建立索引提高效率。

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

explain select id,age,phone from tb_user order by age desc,phone desc;
#也走索引,但是走反向全表索引
explain select id,age,phone from tb_user order by phone,age;
#违背了最左前缀原则,phone走索引,age不走
explain 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);

总结:

1、根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。

2、尽量使用覆盖索引。

3、多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)。

4、如果不可避免的的出现filesort,大量数据排序时,可以适当增大排序缓冲区sort_buffer_size(默认256k)

4、group by优化

drop index idx_age_phone on tb_user;
drop index tb_user_age_gender_pro on tb_user;
explain select profession,count(*) from tb_user group by profession;
#Extra:Using temporary用到了临时表,性能较低
#创建索引
create index tb_user_age_gender_pro on tb_user(age,gender,profession);
explain select profession,count(*) from tb_user group by profession;
#Extra:Using index及Using temporary原因在于违背了最左前缀原则
#根据age进行分组
explain select age,count(*) from tb_user group by age;

在分组操作时,可以通过索引来提高效率,并且索引的使用也需要满足最左前缀法则。 

5、limit优化

select * from staff_table limit 3;
select * from staff_table limit 3, 3;
select * from staff_table limit 6, 3;
#如果数据库数据量过大,查询页数越大所耗费的时间就越长而且MySQL所需要排序的数据量也比较庞大,而我们仅仅需要三行数据,其他记录丢弃,查询排序的代价很大。

 优化方案:通过覆盖索引加子查询的形式来优化

select * from staff_table limit 3;
select * from staff_table limit 3, 3;
select * from staff_table limit 6, 3;
#如果数据库数据量过大,查询页数越大所耗费的时间就越长
show index from staff_table;
alter table staff_table add constraint staff_table_id primary key(id);
select s.* from staff_table s ,(select * from staff_table limit 6, 3) a where s.id=a.id;
#我们可以把select * from staff_table limit 6, 3的查询结果看成一张表

6、count优化

· MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高,而InnoDB引擎相对比较麻烦,他执行count(*)的时候,需要把数据一行一行的从引擎里面读出来,然后累积计数。

优化思路:自己计数

· count的几种用法

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

2、用法:count(8)、count(逐渐)、count(字段)、count(1)。

count(主键):InnoDB引擎会遍历整张表,帮每一行的主键id值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为null)。

count(字段):

        没有not null约束:InnoDB会遍历整张表把每一行的字段值都提取出来,返回服务层,服务层判断是否为null,不为null,计数累加。

        有not null约束:InnoDB会遍历整张表把每一行的字段值都提取出来,返回服务层,直接按行进行累加。

count(1):InnoDB引擎遍历整张表,但不取值。服务器对于返回的每一行,放一个数字“1”进去,直接按行进行累加。

count(*):InnoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。

按照效率排序,count(*)效率更高,count(字段)效率最低,所以尽量使用count(*)。

7、update优化

我们在使用UPDATE更新语句更改表中数据时,可能会导致表中产生行级锁或者是表级锁。

UPDATE语句的优化就是为了避免表中出现表级锁,从而影响并发的性能。

当UPDATE语句更新表数据时,WHERE条件使用的是索引字段,那么此时会出现行级锁,只是锁住这一行数据,对表中其他的数据没有任何影响,性能最高,但是当WHERE条件使用的不是索引字段时,此时就会出现表级锁,只有当UPDATE语句的事务提交完毕,表级锁才会释放,大大影响并发的性能。

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

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

相关文章

AI算不出9.11和9.9哪个大?六家大模型厂商总结了这些原因

大模型“答对”或“答错”其实是个概率问题。关于“9.11和9.9哪个大”,这样一道小学生难度的数学题难倒了一众海内外AI大模型。7月17日,第一财经报道了国内外“12个大模型8个都会答错”这道题的现象,大模型的数学能力引发讨论。 “从技术人员…

puzzle(0611)《组合+图论》追捕问题

目录 一,追及问题 1,警察和小偷 2,旋转的4个硬币 3,抓狐狸 二,围堵问题 三,追及围堵 一,追及问题 1,警察和小偷 如下图,警察先走,警察和小偷轮流一人…

【LLM】基于ColossalAI-0.3.6对llama2-7B-Chat做全参数微调

文章目录 环境准备工作下载llama2-7B下载ColossalAI数据集准备准备原始数据集数据集处理开始训练准备训练脚本运行脚本推理验证加载模型推理环境 操作系统: ubuntu22.04机器规格: CPU:96c;内存:736 GiB;GPU:8 * NVIDIA V100 (32GB)软件信息: Python 3.11.5;ColossalA…

在 Navicat BI 创建自定义字段:类型更改字段

早在 Navicat 17 的预览版中,我们就已经介绍了一些新的商业智能(BI)功能,即图表互动和计算字段。需要说明的是,计算字段不是 Navicat BI 中唯一可用的自定义字段类型。事实上,有五种:类型改变、…

自定义View(8)View的绘制流程

安卓UI的重点之一就是View的绘制流程,经常出现在面试题中。熟悉View的绘制流程,不仅能轻松通过View相关的面试,也可以让我们更加方便的使用自定义View以及官方View。此篇先以常见面试题为切入点,说明自定义View的重要性&#xff0…

LLM大模型实战项目--基于Stable Diffusion的电商平台虚拟试衣

本文详细讲解LLM大模型实战项目,基于Stable Diffusion的电商平台虚拟试衣 一、项目介绍 二、阿里PAI平台介绍 三、阿里云注册及开通PAI 四、PAI_DSW环境搭建 五、SDLORA模型微调 一、项目介绍 AI虚拟试衣是一种创新的技术,利用人工智能和计算机视觉技…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 卢小姐的生日礼物(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测…

为什么现在的小家电换了Type-C接口后需要PD诱骗芯片

在当今科技飞速发展的时代,小家电产品正经历着前所未有的变革。随着消费者对于便捷性、高效性和安全性的要求不断提高,小家电产品的接口设计也逐渐向Type-C接口靠拢。然而,这一转变并非简单的接口替换,它背后隐藏着对PD诱骗芯片的…

【PG】PostgreSQL高可用之repmgr事件通知

目录 描述 结合脚本 占位符 repmgr命令 生成的事件: repmgrd 生成的事件(流复制模式): 描述 每次repmgr或repmgrd执行重大事件时,都会将该事件的记录连同时间戳、失败或成功的标识以及进一步的详细信息&#xff08…

docker安装好了,但是启动失败

新项目要用docker部署,但是docker安装完后,启动失败,服务器用的是国产化的(之前的服务器非国产化,之前也没任何问题),国产化的使用起来问题一大堆,还是bclinux 安装好后重启一直显示 使用journalctl -xe也没任何报错 使用systemctl status docker查看docker状态是灰…

VScode:前端项目中yarn包的安装和使用

一、首先打开PowerShell-管理员身份运行ISE 输入命令: set-ExecutionPolicy RemoteSigned 选择“全是”,表示允许在本地计算机上运行由本地用户创建的脚本,没有报错就行了 二、接着打开VScode集成终端,安装yarn插件 输入 npm ins…

ELK日志分析系统部署文档

一、ELK说明 ELK是Elasticsearch(ES) Logstash Kibana 这三个开源工具组成,官方网站: The Elastic Search AI Platform — Drive real-time insights | Elastic 简单的ELK架构 ES: 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它…

前端pc和小程序接入快递100(跳转方式和api方式)====实时查询接口

文章目录 跳转方式微信小程序(我以uniapp为例)pc api接入说明关于签名计算成功示例 跳转方式 没有任何开发成本,直接一键接入 可以直接看官方文档 https://www.kuaidi100.com/openapi/api_wxmp.shtml 微信小程序(我以uniapp为例…

Python求均值,方差,标准差

参考链接:变异系数(Coefficient of Variation,COV)和协方差(Covariance, Cov)-CSDN博客 参考链接:pandas中std和numpy的np.std区别_numpy pandas std-CSDN博客 在计算蛋白质谱数据中的每个蛋白对应的变异…

C++内存管理(区别C语言)深度对比

欢迎来到我的Blog,点击关注哦💕 前言 前面已经介绍了类和对象,对C面向对象编程已经有了全面认识,接下来要学习对语言学习比较重要的是对内存的管理。 一、内存的分区 代码区:存放程序的机器指令,通常是可…

从操作系统层面认识Linux

描述进程-PCB Linux操作系统下的PCB是: task_struct https://www.cnblogs.com/tongyan2/p/5544887.htmlhttps://www.cnblogs.com/tongyan2/p/5544887.html校招必背操作系统面试题-什么是 PCB(进程控制块) ?_哔哩哔哩_bilibili校招必背操作系…

WSL-Ubuntu20.04环境使用YOLOv8 TensorRT推理加速

在阅读本章内容之前,需要把部署环境以及训练环境都安装好。 1.TensorRTX下载 这里使用Wang-xinyu大佬维护的TensorRTX库来对YOLOv8进行推理加速的演示,顺便也验证一下前面环境配置的成果。 github地址:GitHub - wang-xinyu/tensorrtx,下载后放到wsl的路径下,我这里放在/h…

transformer论文讲解

1.标题 作者 Transformer 开创了继 MLP 、CNN和 RN 之后的第四大类模型。200页综述(来自评论区: https://arxiv.org/pdf/2108.07258.pdf )建议将Transformer作为基础模型。 标题:XXX is all you need. 头条标题。 Attention i…

Docker部署内网穿透服务

前提 首先!市面上的可下载的内网穿透是不是都非常的不好用,本地开发测试用起来都不方便。免费版本的各有限制。从无条件免费到后面维护的越来越复杂。无脑人(我)只需要下面这个。 一个是随机域名不定期会更换,一个是隧…

【数据结构】链表(LinkedList)详解

文章目录 [toc] 前言1. 链表的介绍1.1 链表的定义1.2 链表的结构种类 2. 单向链表的模拟实现2.1 创建链表2.2 打印链表2.3 求链表长度 3. 单向链表常见方法的模拟实现3.1 头插法3.2 尾插法3.3 指定位置插入3.4 查找值 key 的节点是否在链表中3.5 删除值为 key 的节点3.6 删除所…