MySQL进阶——SQL优化

目录

1插入数据

1.1 insert

1.2大批量插入数据

2主键优化

3 order by 优化

4 group by 优化

5 limit 优化

6 count 优化

6.1概述

6.2 count用法

7 update优化

1插入数据

1.1 insert

优化方案主要有3种

批量插入数据

Insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');

手动控制事务

主键顺序插入,性能要高于乱序插入

1.2大批量插入数据

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

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

mysql --local-infile -u root -p

(2)设置全局参数local_infile为1或on,开启从本地加载文件导入数据的开关

 set global local_infile = 1;

(3)在finalshell底栏上传数据到sql文件夹,然后可以进行查看

wc -l tb_sku1.sql;  #看看数据有多少行,-L是不定

head tb_sku1.sql;  #看看数据的前10行

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

load data local infile '/root/sql/tb_sku1.sql' into table `tb_sku` fields terminated by ',' lines terminated by '\n';

每个字段逗号,分隔,每行数据\n分隔。

2主键优化

(1)数据组织方式

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

(2)主键乱序插入时,会出现页分裂的现象,比较耗性能

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

(4)主键索引的设计原则

1)满足业务需求的情况下,尽量降低主键的长度。

太长会占用磁盘空间,在搜索查询时会占用磁盘IO,

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

乱序插入可能会出现页分裂现象,耗费性能。

3)尽量不要使用UUID做主键或者是其他自然主键,如身份证号。

UUID是无序的,且很长

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

3 order by 优化

MySQL的排序,有两种方式:

(1)Using filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。 (2)Using index : 通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要 额外排序,操作效率高。

对于以上的两种排序方式,Using index的性能高,而Using filesort的性能低,我们在优化排序 操作时,尽量要优化为 Using index。

案例:

(1)将tb_user2这个表的索引删减到这些。

(2)现在按照age和phone排序,都是使用Using filesort进行排序的,因为这两个字段都没有索引。

(3)创建联合索引(age,phone)

create index idx_user_age_phone on tb_user2(age,phone);

升序联合索引结构图示:

(4)现在再来排序查询

联合索引是age为第一个字段,上面两个先按照age排序,都是按照Using index的方式,但是下面两个出现了Using filesort,是因为违背了最左前缀法则。

(5)反向扫描

在B-Tree中的叶子节点,按照age升序,如果age相同,再按照phone升序(创建索引不指定时默认升序)。这里都要倒序,就需要反向扫描。

(6)一升一降

因为创建索引没有指定排序,就默认是升序,这里phone要降序,就需要额外的排序。

(7)创建索引指定排序方向(优化!!!)

create index idx_user_age_phone_ad on tb_user2(age asc,phone desc);

(8)这时候再一升一降就是按照索引了,没有额外的了

order by优化原则:

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

B. 尽量使用覆盖索引(不要使用select *,尽量不要造成回表查询)。

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

D. 如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区大小

sort_buffer_size(默认256k)。

修改缓冲区大小的代码:

show variables like 'sort_buffer_size';

set sort_buffer_size=262145;

4 group by 优化

(1)删掉除开主键以外的索引

drop index idx_user_email_5 on tb_user2;

(2)没有索引时,执行分组操作

分组就不要select*,没有任何意义,查询sql执行发现用到了临时表Using temporary 。

(3)创建索引再查询——尽量创建联合索引(profession,age,status)

create index idx_user_pro_age_sta on tb_user2(profession,age,status);

发现查询profession,age都是利用的索引

(4)遵守最左前缀法则

当跳过第一个字段profession,直接用age

explain select age,count(*) from tb_user2 group by age;

但是profession不一定要在group by后面,只要出现了就行。

5 limit 优化

在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低。

因为,当在进行分页查询时,如果执行 limit 1000000,10 ,此时需要MySQL排序前1000010 记 录,仅仅返回 1000000 - 1000010 的记录,其他记录丢弃,查询排序的代价非常大 。

SQL代码:select * from tb_sku limit 1000000,10;

优化方法:覆盖索引+子查询

In后面不能用到limit这样的关键字,不支持这种语法。

错误SQL:select * from tb_sku where id in(select * from tb_sku limit 1000000,10);

正确SQL代码:

select s.* from tb_sku s,(select * from tb_sku limit 1000000,10) a where s.id=a.id;

6 count 优化

6.1概述

如果数据量很大,在执行count操作时,是非常耗时的(默认是InnoDB 引擎)。

(1)MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个 数,效率很高; 但是如果是带条件的count,MyISAM也慢。

(2)InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出 来,然后累积计数。

6.2 count用法

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

count用法:count(*)、count(主键)、count(字段)、count(数字)

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

(2)count(字段) 没有not null 约束 : InnoDB 引擎会遍历整张表把每一行的字段值都取出 来,返回给服务层,服务层判断是否为null,不为null,计数累加。 有not null 约束:InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返 回给服务层,直接按行进行累加。

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

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

按照效率排序的话,count(字段) < count(主键 id) < count(1) ≈ count(*),

所以尽量使用 count(*)

7 update优化

优化:更新字段时最好根据索引字段更新(InnoDB 引擎默认是行锁。)

如果更新索引字段,则事务执行时只会锁住这一行,如事务1锁住id=4的行,不会影响id=1的行操作。update course set name = 'C++' where id = 1;

如果不是用索引字段,则会将整个表锁住。

如下事务1用的非索引字段name,在未提交前将整个表都锁住了,事务2就只能等待。

事务2在事务1提交完之后才能执行。

InnoDB的行锁是针对索引加的锁,不是针对记录加的锁 ,并且该索引不能失效,否则会从行锁升级为表锁。表锁状态并发性会降低

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于MATLAB仿真LFM线性调频信号

基于MATLAB仿真LFM线性调频信号 目录 前言 一、LFM信号简介 二、LFM信号基本原理 三、LFM信号仿真 四、代码 总结 前言 仿真中的接收信号&#xff0c;有时为了简单会直接用一个正弦波代替&#xff0c;但实际中接收到的信号极少是点频信号&#xff0c;一般都是PSK信号、OF…

6G时代,即将来临!

日前&#xff0c;由未来移动通信论坛、紫金山实验室主办的2024全球6G技术大会在南京召开。本次大会以“创新预见6G未来”为主题&#xff0c;在大会开幕式上发布了协力推进全球6G统一标准行动的倡议和紫金山科技城加速培育以6G技术引领未来产业行动计划。 在我国已开展第五代移动…

细说MCU的ADC模块单通道单次采样的实现方法

目录 一、工程依赖的硬件 二、设计目的 三、建立工程 1、配置GPIO 2、配置中断 3、配置串口 4、配置ADC 5、选择时钟源和Debug 6、配置系统时钟和ADC时钟 四、设置采样频率 五、代码修改 1、重定义外部中断回调函数 2、启动ADC 3、配置printf函数 六、运行并…

C++之模板(二)

1、类模板 2、使用类模板 类模板在使用的时候要显示的调用是哪种类型&#xff0c;而不是像函数模板一样能够根据参数来推导出是哪种类型。 Stack.h #include <stdexcept>template <typename T> class Stack { public:explicit Stack(int maxSize);~Stack();void …

基于Java实训中心管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

ciscn_2019_n_1

前戏--------checksec,运行查看 进入就可以发现这段代码 很浅显易懂 我们要得到的后面是 这里 我们要利用的漏洞是 get函数 0x30大小 加上8 exp: from pwn import * ghust remote("node5.buuoj.cn",28777) addr 0x4006BE payload bA * 0x30 bB*0x8 p64(addr…

Honeyview图片查看:从未如此流畅

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、Honeyview2、核心特点 二、下载安装1、下载2、安装 三、使用方法1、图片打开2、自…

【字符串 状态机动态规划】1320. 二指输入的的最小距离

本文涉及知识点 动态规划汇总 字符串 状态机动态规划 LeetCode1320. 二指输入的的最小距离 二指输入法定制键盘在 X-Y 平面上的布局如上图所示&#xff0c;其中每个大写英文字母都位于某个坐标处。 例如字母 A 位于坐标 (0,0)&#xff0c;字母 B 位于坐标 (0,1)&#xff0…

Flask之模板

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、模板的基本用法 1.1、创建模板 1.2、模板语法 1.3、渲染模板 二、模板辅助工具 2.1、上下文 2.2、全局对象 2.3、过滤器 2.4、测试…

投票多功能小程序(ThinkPHP+Uniapp+FastAdmin)

&#x1f389;你的决策小助手&#xff01; 支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、支持数据库私有化部署&#xff0c;Uniapp提供全部无加密源码。​ 一、引言&#xff1a;为什么我们需要多功能投票小程序&#…

AI+前端技术的结合(实现图片识别功能)

随着人工智能技术的不断发展&#xff0c;AI在前端设计页面中的应用变得越来越普遍。比如&#xff1a;在电商平台上&#xff0c;可以利用对象检测技术实现商品的自动识别和分类&#xff1b;人脸识别&#xff1b;车辆检测&#xff1b;图片识别等等......其中一个显著的应用是在图…

ArcGIS与Excel分区汇总统计三调各地类面积!数据透视表与汇总统计!

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 01 需求说明 介绍一下ArcGIS与Excel统计分区各地类的三调地类面积。 ArcGIS统计分析不会&#x…

SpringBoot测试实践

测试按照粒度可分为3层&#xff1a; 单元测试&#xff1a;单元测试&#xff08;Unit Testing&#xff09;又称为模块测试 &#xff0c;是针对程序模块&#xff08;软件设计的最小单位&#xff09;来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中…

Linux驱动开发笔记(十三)Sysfs文件系统

文章目录 前言一、Sysfs1.1 Sysfs的引入1.2 Sysfs的目录结构1.2 Sysfs的目录详解1.2.1 devices1.2.2 bus1.2.3 class1.2.4 devices、bus、class目录之间的关系1.2.5 其他子目录 二、Sysfs使用2.1 核心数据结构2.2 相关函数2.2.1 kobject_create_and_add2.2.2 kobject_put()2.2.…

视觉理解与图片问答,学习如何使用 GPT-4o (GPT-4 Omni) 来理解图像

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、引言 OpenAI 最新发布的 GPT-4 Omni 模型&#xff0c;也被称为 GPT-4o&#xff0c;是一个多模态 AI 模型&#xff0c;旨在提供更加自然和全面的人机交互体验。 GPT-4o 与 GPT-4 Turbo 都具备视觉功…

MySQL程序使用的选项文件

MySQL程序使用的选项文件如下&#xff1a; 显示帮助消息并退出。 在具有多个网络接口的计算机上&#xff0c;使用此选项可以选择用于连接MySQL服务器的接口。 安装字符集的目录。 如果可能&#xff0c;压缩客户端和服务器之间发送的所有信息。 从MySQL 8.0.18开始&#xff0c;…

【因果推断python】50_去偏/正交机器学习2

目录 Frisch-Waugh-Lovell on Steroids CATE Estimation with Double-ML Frisch-Waugh-Lovell on Steroids 双重/偏差 ML 其思想非常简单&#xff1a;在构建结果和治疗残差时使用 ML 模型&#xff1a; 是估计&#xff0c;是估计 我们的想法是&#xff0c;ML 模型具有超强的…

【RK3588/算能/Nvidia智能盒子】AI算法应用于中国生物疫苗生产过程智能监测,赋能生产安全,提升品质管控

因操作失误导致食品药品质量事故频发 计算机视觉检测技术为监管提供新思路 近年来&#xff0c;各类因人员操作失误导致的食品药品质量事故不断发生。例如有员工取出原材料及称重确认时未进行双人复核导致“混药”、员工未能按照生产步骤对生牛奶进行杀菌导致奶酪污染、员工误将…

webpack5入门,根据官方文档简单学习,简单总结

c.**loader加载器&#xff1a;**webpack 只能理解 JS文件和 JSON 文件&#xff0c;loader 让 webpack 能够去处理其他类型的文件&#xff0c;并将它们转换为有效 模块&#xff0c;以供应用程序使用&#xff0c;以及被添加到依赖图中。&#xff08;比如css&#xff0c;less&…

人人讲视频如何下载

一、工具准备 1.VLC media player 2.谷歌浏览器 二、视频下载 1.打开人人讲网页&#xff0c;需要下载的视频 谷歌浏览器打开调试窗口 搜索m3u8链接 拷贝到VLCplayer打开网络串流方式打开测试是否能正常播放 2.下载视频 能正常播放后&#xff0c;切换播放为转换选择mp4格式…