【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.rhkb.cn/news/379752.html

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

相关文章

Linux——多路复用之select

目录 前言 一、select的认识 二、select的接口 三、select的使用 四、select的优缺点 前言 在前面,我们学习了五种IO模型,对IO有了基本的认识,知道了select效率很高,可以等待多个文件描述符,那他是如何等待的呢&a…

视频活码如何在线制作?分享快速制作二维码的方法

视频想要快速的分享现在有很多的人会选择二维码的方式,将视频转换成二维码通过手机扫码就能够快速在线查看视频内容,这样可以不占用扫码者自身的内存,随时扫码从云端调取内容查看,更加的方便快捷便于内容的分享。那么具体该如何实…

搭建个人智能家居 7 - 空气颗粒物检测

搭建个人智能家居 7 - 空气颗粒物检测 前言说明PMS5003ESPHomeHomeAssistant结束 前言 到目前为止,我们这个智能家居系统添加了4个外设,分别是:LED灯、RGB灯、DHT11温度传感器和SGP30。今天继续添加环境测量类传感器“PMS5003空气颗粒物检测…

【Leetcode】二十一、前缀树 + 词典中最长的单词

文章目录 1、背景2、前缀树Trie3、leetcode208:实现Trie4、leetcode720:词典中最长的单词 1、背景 如上,以浏览器搜索时的自动匹配为例: 如果把所有搜索关键字放一个数组里,则:插入、搜索一个词条时&#x…

VisualRules-Web案例展示(一)

VisualRules单机版以其卓越的功能深受用户喜爱。现在,我们进一步推出了VisualRules-Web在线版本,让您无需安装任何软件,即可在任何浏览器中轻松体验VisualRules的强大功能。无论是数据分析、规则管理还是自动化决策,VisualRules-W…

【深度学习】PyTorch框架(3):优化与初始化

1.引言 在本文中,我们将探讨神经网络的优化与初始化技术。随着神经网络深度的增加,我们会遇到多种挑战。最关键的是确保网络中梯度流动的稳定性,否则可能会遭遇梯度消失或梯度爆炸的问题。因此,我们将深入探讨以下两个核心概念&a…

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

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

活动回顾 | AutoMQ 联合 GreptimeDB 共同探讨新能源汽车数据基础设施

7 月 13 日,AutoMQ 携手 GreptimeDB“新能源汽车数据基础设施” 主题 meetup 在上海圆满落幕。本次论坛多角度探讨如何通过创新的数据管理和存储架构,提升汽车系统的性能、安全性和可靠性,从而驱动行业的持续发展和创新,涵盖 Auto…

全时守护,无死角监测:重点海域渔港视频AI智能监管方案

一、方案背景 随着海洋经济的快速发展和海洋资源的日益紧缺,对重点海域渔港进行有效监控和管理显得尤为重要。视频监控作为一种高效、实时的管理手段,已成为渔港管理中不可或缺的一部分。当前,我国海域面积广阔,渔港众多&#xf…

QT CNA上位机报错 解决方案

QT编译报错: -lControlCAN 解决方案 更换三个文件,即可解决(QT 自带的是32位库,应使用64位库文件)

docker desktop历史版本安装

1.安装choco Windows安装 choco包管理工具-CSDN博客 2.通过choco安装 下面例子为安装旧版2.3.0.2,其它版本类似 Chocolatey Software | Docker Desktop 2.3.0.2 https://download.docker.com/win/stable/45183/Docker%20Desktop%20Installer.exe choco install docker-des…

【postgresql】pg_dump备份数据库

pg_dump 介绍 pg_dump 是一个用于备份 PostgreSQL 数据库的实用工具。它可以将数据库的内容导出为一个 SQL 脚本文件或其他格式的文件,以便在需要时进行恢复或迁移。 基本用法 pg_dump [选项] [数据库名] 命令选项 -h 或 --host:指定数据库服务器的主…

跟着操作,解决iPhone怎么清理内存难题

在如今智能手机功能日益强大的时代,我们使用手机拍照、录制视频、下载应用、存储文件等操作都会占用手机内存。当内存空间不足时,手机运行会变得缓慢,甚至出现卡顿、闪退等现象。因此,定期清理iPhone内存是非常必要的。那么&#…

力扣第十七题——电话号码的字母组合

内容介绍 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "23" 输出…

iredmail服务器安装步骤详解!如何做配置?

iredmail服务器安全性设置指南?怎么升级邮件服务器? iredmail是一个功能强大的邮件服务器解决方案,它集成了多个开源软件,使您能够快速部署和管理邮件服务。AokSend将逐步引导您完成安装过程,无需深入的编程知识即可轻…

【ai】学习笔记:电影推荐1:协同过滤 TF-DF 余弦相似性

2020年之前都是用协同过滤2020年以后用深度学习、人工智能视频收费的,不完整,里面是电影推荐 这里有个视频讲解2016年大神分析了电影推荐 :MovieRecommendation github地址 看起来是基于用户的相似性和物品的相似性,向用户推荐物品: 大神的介绍: 大神的介绍: 基于Pytho…

海外营销推广:快速创建维基百科(wiki)词条-大舍传媒

一、维基百科的永久留存问题 许多企业和个人关心维基百科是否能永久留存。实际上,只要企业和个人的行为没有引起维基百科管理方的反感,词条就可以长期保存。如果有恶意行为或被投诉,维基百科可能会对词条进行删除或修改。 二、创建维基百科…

Python项目打包与依赖管理指南

在Python开发中,python文件需要在安装有python解释器的计算机的电脑上才能运行,但是在工作时,我们需要给客户介绍演示项目功能时并不一定可以条件安装解释器,而且这样做非常不方便。这时候我们可以打包项目,用于给客户…

平价养猫必看!测评几十款选出的最值得入手的希喂主食冻干

各位铲屎官,今天来聊聊我近期发现的宝藏主食冻干——希喂CPMR2.0大橙罐。平价养猫必看!,在追求猫咪饮食健康与自身预算平衡的路上,我尝试了多种产品,而希喂以其高含肉量和高营养价值脱颖而出。它让喂食变得多样化且高效…

【STM32】LED闪烁LED流水灯蜂鸣器(江科大)

LED正极:外部长脚、内部较小 LED负极:外部短脚、内部较大 LED电路 限流电阻:保护LED,调节LED亮度(本实验用面包板为了方便,省去了限流电阻,设计电路时要加上) 左上图:低…