MySQL高级(二)

news2024/12/24 21:20:06

一、SQL优化

(一)插入数据

批量插入

多次插入每一次insert都要与数据库建立连接。

INSERT INTO 表名 VALUES (),(),();

一次插入数据不宜过多,不要超过1000条。

手动提交事务

START TRANSACTION;
INSERT INTO 表名 VALUES (),(),();
INSERT INTO 表名 VALUES (),(),();
INSERT INTO 表名 VALUES (),(),();
COMMIT;

主键顺序插入

 

主键顺序插入效率高于乱序插入。

大批量插入数据

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

--查看开关是否开启
SELECT @@local_infile;
--开启开关
SET GLOBAL local_infile=1;
--加载数据
LOAD DATA LOCAL INFILE '/root/sql1.log' INTO TABLE '表名' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';

(二)主键优化

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

 页分裂:页可以为空,也可以填充一半,也可以填充到100%。每个页包含了2-N行数据(如果一行数据足够大,会行溢出),根据主键排序。主键乱序插入时可能会发生。

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

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

MERGE_THRESHOLD:合并页的阈值,可以自己设置,在创建表或者创建索引时指定,在创建表和创建索引的时候可以自己指定。

主键设计原则:

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

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

尽量不要使用UUID做主键或者是其他自然主键,如身份证号,无序,长度也较长。

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

(三)order by优化

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

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

Backward index scan:反向扫描索引。

--根据字段1,字段进行一个降序,一个升序
EXPLAIN SELECT 字段... FROM 表名 ORDER BY 字段1 asc,字段2 desc;
--创建索引
CREATE INDEX idx_字段1_字段2_ad ON 表名(字段1 ASC,字段2 DESC);

优化:

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

尽量使用覆盖索引。

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

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

SHOW VARIABLES LIKE 'sort_buffer_size';

(四)group by优化

Using temporary:用到了临时表。

分组操作时,建立适当索引来提高效率。

分组操作时,索引的使用也是满足最左前缀原则的。

(五)limit优化

一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询的方法优化。

EXPLAIN SELECT a.* FROM 表1 a,(SELECT id FROM 表2 ORDER BY id LIMIT 开始,数量) b WHERE a.id=b.id; 

(六)count优化

在MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高,前提是后面没有where条件。

InnoDB引擎在执行count(*)时,需要把数据一行行地从引擎里面读出来,然后累积计数。

优化思路:没有特别好的优化方案,可以自己计数。

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

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

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

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

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

性能:count(*)~count(1)>count(主键)>count(字段),尽量使用count( *)。

(七)update优化

执行update语句的注意事项:

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

二、视图/存储过程/触发器

(一)视图

视图是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。

视图不保存数据,只保存了SQL的逻辑。我们在创建视图时,主要的工作就在创建这条SQL查询语句上。

创建

CREATE [OR REPLACE] VIEW 视图名称[(列表列名)] AS SELECT语句 [WITH [CASCADED|LOCAL] CHECK OPTION];

封装的就是select查询的数据。

WITH CASCADED CHECK OPTION:防止视图插入的数据不符合创建视图时的条件。

视图的检查选项:当使用WITH CHECK自居创建视图时,MySQL会通过视图检查正在更改的每个行,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,他还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,MySQL提供了两个选项:CASCADED和LOCAL,默认值是LOCAL。

CASCADED:

LOCAL:

查询

--查看创建视图语句
SHOW CREATE VIEW 视图名称;
--查看视图数据
SELECT * FROM 视图名称...;

视图是一种虚拟的表,可以像操作表一样操作视图。

修改

CREATE OR REPLACE VIEW 视图名称{(列名列表)} AS SELECT语句 [WITH [CASCADED|LOCAL] CHECK OPTION];
ALTER VIEW 视图名称{(列名列表)} AS SELECT语句 [WITH [CASCADED|LOCAL] CHECK OPTION];

CREATE OR REPLACE:创建或替换。

删除

DROP VIEW [IF EXISTS] 视图名称 [,视图名称]...;

IF EXISTS:判断是否存在。


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

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

相关文章

车载以太网 - SomeIP - 协议用例 - Format_01

目录 1、验证Client ID字段静态设置为0x0000 2、验证Session ID字段静态设置为0x0001 3、验证Protocol Version字段静态设置为0x01

SpringCloud:ElasticSearch之自动补全

当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项,如图: 这种根据用户输入的字母,提示完整词条的功能,就是自动补全了。 因为需要根据拼音字母来推断,因此要用到拼音分词功能。 1.拼音分词器…

【移动端网页布局】移动端网页布局基础概念 ④ ( 物理像素 | 物理像素比 | 代码示例 - 100 像素在 PC浏览器 / 移动端浏览器 显示效果 )

文章目录 一、物理像素 / 物理像素比二、代码示例 - 100 像素在 PC浏览器 / 移动端浏览器 显示效果 一、物理像素 / 物理像素比 移动端 网页开发 与 PC 端开发有很多不同之处 , 在图片处理方向需要采用 二倍图 / 三倍图 / 多倍图 方式进行图片处理 ; 图片处理的方式与如下的 物…

项目支付接入支付宝【沙箱环境】

前言 订单支付接入支付宝,使用支付宝提供的沙箱机制模拟为订单付款。我这里主要记录一下沙箱环境如何接入到系统中,具体细节的实现。按照官方文档来就可以了。 1、使用步骤 这里有几个重要数据要拿到,一个是支付宝的公钥和私钥&#xff0c…

ClickHouse监控系统Prometheus+Grafana

目录 1 PrometheusGrafana概述2 安装Prometheus Grafana3 配置ClickHouse4 配置Grafana 1 PrometheusGrafana概述 ClickHouse 运行时会将一些个自身的运行状态记录到众多系统表中( system.*)。所以我们对于 CH 自身的一些运行指标的监控数据,也主要来自这些系统表。…

docoker笔记

0.安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道…

RabbitMQ【#1】是什么,有什么用

RabbiMQ是什么? RabbitMQ是一种开源的消息队列软件,它实现了高级消息队列协议(AMQP)并支持多种编程语言。它可以用于将消息从一个应用程序传递到另一个应用程序或进程,并支持分布式系统中的异步消息通信。RabbitMQ的主…

【Linux】System V 共享内存、消息队列、信号量

🍎作者:阿润菜菜 📖专栏:Linux系统编程 system V共享内存介绍 System V 共享内存是一种进程间通信的机制,它允许多个进程共享一块物理内存区域(称为“段”)。System V 共享内存的优点是效率高&…

AD21 PCB----过滤、捕获、板子边框绘制、精准移动

目录 过滤器和捕获 板子边框绘制 精准移动 过滤器和捕获 板子边框绘制 两种方式均在Mechanical 1 方式一: 第一步:利用PCB的基础图形进行绘制边框 第二步:选中绘制的图形 第三步: 方式二:外部导入 第一步&#x…

SpringCloud 微服务系列——【服务间的通信方式、OpenFeign、Hystrix组件使用】

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【UE 粒子系统】电火花粒子效果

效果 步骤 1. 新建一个粒子系统,命名为“SparkParticles” 再新建一个材质,命名为“SparkParticleMaterial” 2. 打开“SparkParticleMaterial”,将混合模式改为半透明,着色模型为无光照 然后添加如下节点 3. 打开“SparkParticl…

输入输出练习

文章目录 1. AB(1)2. AB(2)3. AB(3)4. AB(4)计算一系列数的和5. AB(5) 计算一系列数的和6. AB(6)7. AB(7)8. 字符串排序(1)9. 字符串排序(2)10 字符串排序(2)11. 注意数据范围 1. AB(1) import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public …

差分运算放大电路原理解析

差分运算放大电路,对共模信号得到有效抑制,而只对差分信号进行放大,因而得到广泛的用。 注: (1)共模信号   共模信号(common mode signal)是指同时作用于多个电路或电子设备上的信…

1.10和1.11和1.12、Makefile

1.10和1.11和1.12、Makefile 1.10、Makefile(1)1.10.1、什么是Makefile1.10.2、Makefile的文件命名和规则实际操作 1.11、Makefile(2)1. 工作原理(1.10.3)实际操作 1.12、Makefile(3)1. 变量2. 模式匹配3. 函数实际操作①实现变量和模式匹配②实现函数操…

Vue(简介、前期配置、Vue展示、模板语法)

一、简介 1. 什么是Vue? 2. Vue特点 采用组件化模式,提高代码复用率、且让代码更好维护 组件化:每一部分直接就是大盒子组件(创建一个单独的Vue文件),直接可以修改单独封装的组件部分代码 Vue使用声明式…

为什么需要内网穿透技术?

随着互联网技术的快速发展,企业和个人越来越依赖于网络资源,而内网穿透技术正是解决远程访问内网资源的关键。本文将详细介绍内网穿透的概念及其重要性,以帮助您了解为什么我们需要使用内网穿透技术。 目录 一、内网穿透技术简介 二、为什…

Java中List排序的3种方法

在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进行排序操作。比如从第三方接口中获取所有用户的列表,但列表默认是以用户编号从小到大进行排序的,而我们的系统需要按照用户的年龄从大到小进行排序,这个时候,…

2 变量运算符-基本数据类型讲解【Go语言教程】

2 变量运算符-基本数据类型讲解【Go语言教程】 2.1 变量 2.1.1 声明变量方式 指定变量类型,声明后若不赋值,使用默认值 类型推导 通过: 多变量声明 全局变量定义 在函数外部定义的就是全局变量 变量变量名值数据类型 注意:如果go程序报错&…

UE4/5多人游戏详解(七、自定义委托,实现寻找会话和加入会话的函数,通过Steam进行两台电脑的联机)

目录 可能出现问题(在六部分的测试可能无法连接的问题【在末尾加上了,怕有人没看见在这里写一下】) 自定义委托 调整位置 创建更多的委托和回调函数给菜单: 多播和动态多播 代码: 委托变量 代码: 回…

( “树” 之 BST) 109. 有序链表转换二叉搜索树 ——【Leetcode每日一题】

二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点。 二叉查找树中序遍历有序。 109. 有序链表转换二叉搜索树 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度…