SQL高级 --优化

news2025/2/28 17:16:47

一、SQL查询的解析

  • 关联查询过多
  • 索引失效(单值、符合)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

二、mysql explain使用简介

在这里插入图片描述在这里插入图片描述

1、关于id的说明:

在这里插入图片描述

2 、select_type

常见和常用的值有如下几种:

分别用来表示查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。

1、 SIMPLE 简单的select查询,查询中不包含子查询或者UNION

2、 PRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY

3、 SUBQUERY 在SELECT或WHERE列表中包含了子查询

4、DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中

5、UNION 若第二个SELECT出现在UNION之后,则被标记为UNION:若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
6、UNION RESULT 从UNION表获取结果的SELECT

3、 关于 type 说明

在这里插入图片描述
在这里插入图片描述

4 、 table

指的就是当前执行的表

5 、possible_keys 和 key

possible_keys: 显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。
key : 实际使用的索引,如果为NULL,则没有使用索引。(可能原因包括没有建立索引或索引失效)

6、 explain 关于 EXtra介绍

包含不适合在其他列中显式但十分重要的额外信息
在这里插入图片描述

6.1 Using filesort(九死一生)

说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”。

6.2 Using temporary(十死无生)

使用了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。

6.3 Using index(发财了)

表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。

6.4 Using where

表明使用了where过滤

6.5 Using join buffer

表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些。

6.6 impossible where

where子句的值总是false,不能用来获取任何元组

SELECT * FROM t_user WHERE id = '1' and id = '2'

### 6.7 select tables optimized away
在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。

### 6.8 distinct
优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

覆盖索引(Covering Index), 一般说为索引覆盖。

  • 理解方式一:就是select的数据列只用从索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖
  • 理解方式二:索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。一个索引包含了(或覆盖了)满足查询结果的数据就叫做覆盖索引。

- 小练习

在这里插入图片描述

答案:在这里插入图片描述

Join语句的优化

在这里插入图片描述

常见失效:

在这里插入图片描述

第2点解释、最佳左侧法则:

如果索引了多例,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列
自己理解:(在复合索引中)按照复合索引中的第一个字段进行引用。

第4点解释、存储引擎不能使用索引中范围条件右边的列。存储引擎不能使用索引中范围条件右边的列的比较

第5点解释、


在这里插入图片描述

第6点解释、

在这里插入图片描述

第7点解释、

在这里插入图片描述

第8点解释、

在这里插入图片描述
解决方法

  • like 匹配的值可以在左边写 % ,右边不能写。
  • 可以使用覆盖索引解决

第9点解释、字符串不加单引号索引失效

在这里插入图片描述

in与exists

在这里插入图片描述
在这里插入图片描述

ORDER BY优化

在这里插入图片描述

  • MySQL支持二种方式的排序,FileSort和Index,Index效率高.它指MySQL扫描索引本身完成排序。FileSort方式效率较低。在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

MYSQLDUNMPSLOW

在这里插入图片描述

在这里插入图片描述

三、批量导入数据时(1000w)时注意

在这里插入图片描述

  • 示例
  • 在这里插入图片描述
CREATE TABLE demo_dept(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
dname VARCHAR(20) NOT NULL DEFAULT "",
loc VARCHAR(13)NOT NULL DEFAULT ""
)ENGINE=INNODB ;

在这里插入图片描述

#创建表 demo_emp
CREATE TABLE demo_emp(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,##/*编号*
ename VARCHAR(20)NOT NULL DEFAULT"",##*名字*
job VARCHAR(9)NOT NULL DEFAULT"",##*工作*
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, ##/*上级编号*
hiredate DATE NOT NULL,##*入职时间*
sal DECIMAL(7,2) NOT NULL,##*薪水*
comm DECIMAL(7,2) NOT NULL,##*红利*
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0##*部门编号*
)ENGINE=INNODB ;

  • 2.1随机产生字符串
    在这里插入图片描述
##随机产生字符串
DELIMITER $$
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN
	DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghjklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUWWXYZ';
	DECLARE return_str VARCHAR(255) DEFAULT '';
	DECLARE i INT DEFAULT 0;
	WHILE i<n DO
	SET return_str=CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
	SET i=i+1;
	END WHILE;
	RETURN return_str;
END $$
  • 2.2随机产生部门编号
    在这里插入图片描述
#用于随机产生部门编号
DELIMITER $$
CREATE FUNCTION rand_num()
RETURNS INT(5)
BEGIN
DECLARE i INT DEFAULT 0;
SET i= FLOOR(100+RAND()*10);
RETURN i;
END $$

  • 2.3创建往emp表中插入数据的存储过程(进行一次提交)
    在这里插入图片描述

CREATE DEFINER=`root`@`%` PROCEDURE `insert_emp`(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
##set autocommit =)把autocommit设置成0
SET autocommit = 0;
REPEAT
SET i = i+ 1;
INSERT INTO demo_emp (empno, ename ,job ,mgr ,hiredate ,sal ,comm ,deptno ) VALUES((START+i),rand_string(6),'SALESMAN',0001,CURDATE(),2000,400,rand_num());
UNTIL i = max_num END REPEAT;
COMMIT;
END

3、验证
在这里插入图片描述

  • 练习
    在这里插入图片描述

四 Profile进行sql分析

4.1 是否支持
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查询时不要出现的:

在这里插入图片描述

4.2全局日志

在这里插入图片描述

  • 1 、配置启用在这里插入图片描述
  • 1 、编码置启用
    在这里插入图片描述

五、数据库锁机制

在这里插入图片描述
在这里插入图片描述
查看锁的命令 : show open tables;
在这里插入图片描述
释放锁

unlock 表名

在这里插入图片描述
在这里插入图片描述

简而言之,就是读锁会阻塞写,但是不会堵塞读。而写锁则会把读和写都堵塞。

六、ACID原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

事务隔离级别

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
手动提交事务
在这里插入图片描述

七、大坑

7.1 无索引行锁升级为表锁

我们知道锁主要是加在索引上,如果对非索引字段更新,行锁可能会变表锁 , 从上面的测试中也可以验证这个观点。

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

所以建表的时候 ,结合你的业务,如果有更新的操作,切记要对操作的字段建立索引,不然并发下这个问题就非常明显

7.2 间隙锁危害

对条件范围进行加锁
在这里插入图片描述

7.3 面试常见问题: 如何锁一行

在这里插入图片描述
杭锁总结:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


# 通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况
show STATUS LIKE 'innodb_row_lock%'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、 主从复制

8.1原理

在这里插入图片描述

8.2 规则在这里插入图片描述

复制的最大问题:有延时 !
在这里插入图片描述

一主一从配置

  1. MySQL版本必须一致。
  2. 主从都配置在[mysqld]结点下,都是小写
  3. 主机 my.ini配置
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  4. 从机配置
  • [必须]从服务器唯一ID
  • [可选]启用二进制日志
  1. 关闭防火List item

  2. 在Windows主机上建立帐户并授权slave
    在这里插入图片描述
    在这里插入图片描述

  3. 从机配置在这里插入图片描述
    在这里插入图片描述

  4. stop slave ; -如何停止从服务复制功能

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

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

相关文章

Java常用框架(二)

三、Netty 1.概述 1.1 为什么要选Netty? 使用Netty不必编写复杂的逻辑代码去实现通信&#xff0c;再也不需要去考虑性能问题&#xff0c;不需要考虑编码问题&#xff0c;半包读写等问题。Netty是最流行的NIO框架&#xff0c;它的健壮性、功能、性能、可定制性和可扩展性在同…

关于android中有关JNI无法生成.so文件的问题解决方法

问题&#xff1a;在配置NDK开发环境时&#xff0c;会发现无法正常生成so文件的情况&#xff0c;可能时AS本身的bug&#xff0c;这时候提供一种方法手动生成so文件 一 配置NDK 1.1 在File | Settings | Appearance & Behavior | System Settings | Android SDK | SDK Tool…

【Linux】常用命令大全(二)

目录 4. Linux常用命令 4.1 Linux命令初体验 4.2 文件目录操作命令 4.3 拷贝移动命令 4.4 打包压缩命令 4.5 文本编辑命令 4.6 查找命令 4. Linux常用命令 4.1 Linux命令初体验 4.1.1 常用命令演示 在这一部分中&#xff0c;我们主要介绍几个常用的命令&#xff0c…

深度学习基础训练流程

深度学习基础训练流程 前言 本文只是本人学习笔记记录&#xff0c;文中部分图片来源网络&#xff0c;如有侵权请联系我进行删除 1、深度学习基础 1.1 深度学习 深度学习是机器学习的一个分支&#xff0c;目的是找到一组良好的参数θ&#xff0c;使得θ表示的数学模型能够很…

K8S多节点二进制部署

目录 一、多 Maser 集群架构的了解 二、master2 节点部署 1、从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点 2、修改配置文件kube-apiserver中的IP 3、在 master02 节点上启动各服务并设置开机自启 4、查看node节点状态 三、负…

1-MATLAB APP Design-图像的输入与输出

一、APP 界面设计展示 新建一个空白的APP,在此次的学习中,我们会用到编辑字段(文本框)、 按钮、坐标区和面板,首先在界面中拖入一个编辑字段(文本框),在文本框中输入内容:图形的输入与输出,调整背景颜色,字体的颜色为黑色,字体的大小调为25.

开通腾讯位置服务

文章目录一、开通腾讯位置服务步骤二、腾讯位置服务SDK三、小程序项目中&#xff0c;创建 lib 目录&#xff0c;把SDK文件放入其中一、开通腾讯位置服务步骤 因为签到流程中要获取用户当前所在地址的信息&#xff0c;所以需要把定位坐标缓存成地址&#xff0c;恰好腾讯位置服务…

【 java 8】Lambda 表达式

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

MySQL 性能优化思路和工具

MySQL 性能优化思路和工具 一、优化思路 作为架构师或者开发人员&#xff0c;说到数据库性能优化&#xff0c;你的思路是什么样的&#xff1f; 或者具体一点&#xff0c;如果在面试的时候遇到这个问题&#xff1a;你会从哪些维度来优化数据库&#xff0c;你会怎么回答&#x…

Hive内部表与外部表的区别具体说明

目录 1.在/opt/atguigu/目录下&#xff0c;新建两个txt文件 2.在hadoop的web端递归创建一个目录&#xff0c;存储这两个文件 3.查看web端的文件 一、内部表&#xff1a; 1.创建一个内部表&#xff0c;并指定内部表的存储位置 2.查看内部表&#xff0c;内部表中没有数据 …

技术学习-消息队列

什么是消息队列 可以简单理解为存放消息的队列&#xff0c;数据结构模型和队列一样&#xff0c;都是先进先出。主要用不同线程(Thread)/进程(Process) 为什么需要消息队列 (1)不同进程之间传递消息是&#xff0c;因为进程的耦合度高&#xff0c;改动一个进程&#xff0c;引发…

基于SVPWM改进的永磁同步电机直接转矩控制二更

导读&#xff1a;本期对基于SVPWM的永磁同步电机直接转矩控制进行全面的分析和仿真搭建。之后与传统的DTC进行比较&#xff0c;凸显基于SVPWM改进的DTC方法的有效性。如果需要文中的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;留言获取。一、 传统…

Long型数据后端查询结果为null,返回前端显示-1,使用@JsonSerialize注解

使用场景 在开发中&#xff0c;我们将对象序列化为JSON传输给前端&#xff0c;有时候我们的某个或者某些字段需要特殊处理&#xff0c;比如我们有一个日期字段&#xff0c;我们希望当日期为NULL时给前端不返回NULL而返回为未完成等信息&#xff0c;或者我们有一些状态字段&…

达梦数据库(DM8)集成使用 Geoserver(2.22.2) 以及其他对应版本详解

达梦数据库&#xff08;DM8&#xff09;集成使用 Geoserver&#xff08;2.22.2&#xff09; 以及其他对应版本详解系统环境版本Geoserver 驱动对应版本达梦 8 集成 Geoserver 过程试错过程问题总结项目需要国产化&#xff0c;选择使用达梦数据库&#xff0c;在技术测试阶段&…

K-近邻算法(KNN)

K-近邻算法&#xff08;KNN&#xff09; K nearest neighbour 0、导引 如何进行电影分类 众所周知&#xff0c;电影可以按照题材分类&#xff0c;然而题材本身是如何定义的?由谁来判定某部电影属于哪 个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影…

美创科技荣获“PostgreSQL中国最佳运维服务商”

近日&#xff0c;由中国开源软件推进联盟PostgreSQL分会&中科院软件所&CSDN联合举办主办的“中国PostgreSQL数据库生态大会”在北京中科院软件所隆重召开。美创科技受邀参加&#xff0c;三位顶级数据库技术专家亮相&#xff0c;分享美创科技在数据库内核技术、PostgreS…

IMX6ULL学习笔记(17)——工程管理

一、简介 之前我们把所有源码文件放在一个文件夹下。 这样做存在两个主要问题&#xff0c;第一&#xff0c;代码存放混乱不易阅读。第二&#xff0c;程序可移植性差。如果工程源文件达到几十、甚至数百个的时候&#xff0c;这样一股脑全部放到根目录下就会使工程显得混乱不堪。…

STM32开发(13)----获取唯一设备标识符UID

获取唯一设备标识符UID前言一、什么事UID二、实验过程1.CubeMx配置2.代码实现3.实验结果总结前言 这一章节介绍如何获取STM32芯片中的唯一的ID号的两种方法。 一、什么事UID 在许多项目中&#xff0c;识别设备是必要的。从简单的设备描述到更复杂的设备&#xff0c;如 USB 串…

Open3d入门

目录 点云数据 1 主成分分析 1.1 Method 1.2 Results 2 表面法线估计 2.1 Method 2.2 Results 3 体素网格下采样 3.1 Method 3.2 Results 点云数据 常用数据下载&#xff08;免积分&#xff09; 1 主成分分析 1.1 Method 对点云进行主成分分析&#xff08;PCA&…

[5/101] 101次面试之经典面试题

目录 01、什么是黑盒测试? 02、为什么要做黑盒测试? 03、你在软件生命周期中的哪些测试阶段用到过黑盒测试? 04、什么是白盒测试&#xff1f; 05、白盒测试与黑盒测试有什么区别&#xff1f; 06、为什么要对程序进行单元测试&#xff1f; 07、由谁来做单元测试&#…