当前位置: 首页 > news >正文

一篇就够mysql高阶知识总结

一、事务的ACID原则

序号原则说明
1原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做
2一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
3隔离性(Isolation)一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
4持久性(Durability)持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其有任何影响

二、数据库设计的三大范式

序号范式说明
1第一范式(1NF)确保每列保持原子性
2第二范式(2NF)在满足第一范式的前提下,非主属性完全依赖于码
3第三范式(3NF)在满足第二范式的前提下,非主属性不传递依赖于码

三、索引

序号索引类型说明
1二叉树搜索树基础数据结构,用于快速查找、插入和删除
2红黑树平衡二叉搜索树,保持树的平衡以维持操作的高效性
3B树适用于大量数据的磁盘读写操作,保持树的平衡
4B+树B树的变种,非叶子节点不存储数据,更适合作为数据库索引结构
5索引概念数据库中用于提高数据检索效率的数据结构

四、SQL解析

序号内容说明
1SQL解析SQL语句被数据库管理系统解析、编译和执行的过程

五、锁机制

序号锁类型说明
1行锁锁定一行数据
2表锁锁定整个表
3范围锁锁定一定范围的数据
4悲观锁假设最坏情况,数据在修改前会被锁定
5乐观锁假设最好的情况,只在更新操作时检查数据是否被其他事务修改
6读写锁分为读锁和写锁,读锁允许多个读操作并发,写锁则独占

六、JOIN查询

序号内容说明
17种常见的JOIN查询包括INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN等
2SQL语句展示具体的SQL JOIN查询语句
3-9每种JOIN查询的说明与示例分别解释每种JOIN的用法及示例
10Union和Union All介绍UNION和UNION ALL的区别及使用场景

七、索引优化

序号内容说明
1索引分类单值索引、唯一索引、主键索引、复合索引
2Explain性能分析使用EXPLAIN分析SQL查询性能
3索引优化入门案例展示不同场景下的索引优化案例
4索引失效分析分析导致索引失效的常见场景
5分组排序优化优化ORDER BY和GROUP BY的性能
索引分类
序号索引类型说明
1单值索引索引列中的单个值
2唯一索引索引列中的值必须是唯一的,允许NULL值但最多只能有一个
3主键索引特殊的唯一索引,一个表只能有一个主键,且不允许NULL值
4复合索引(组合索引)索引由两个或两个以上的列组成,列的组合值必须唯一或满足特定条件
Explain性能分析
序号字段说明
1sql执行的SQL语句
2idSELECT的标识符,如果查询包含子查询,则会出现多个id
3select_typeSELECT的类型(SIMPLE, PRIMARY, SUBQUERY等)
4table输出行所引用的表
5type连接类型(ALL, index, range, ref, eq_ref, const/system等)
6possible_keys显示可能应用在这张表上的索引,但不一定实际使用
7key实际使用的索引
8key_len使用的索引的长度
9ref显示索引的哪一列或常数被用于查找值
10rowsMySQL认为必须检查的用来返回请求数据的行数估计值
11Extra包含不适合在其他列中显示但十分重要的额外信息,如是否使用索引等
索引优化入门案例
1. 驱动表与被驱动表的选择

在连接查询(如JOIN)中,优化器会决定哪个表作为驱动表(驱动其他表进行连接的表),哪个表作为被驱动表。选择正确的驱动表和被驱动表可以显著提高查询性能。通常,驱动表应该是数据量较小、过滤条件较多、索引效果好的表。

案例
假设有两个表,employees(员工表,包含10万条记录)和departments(部门表,包含100条记录)。如果要查询每个部门下的员工信息,最好让departments表作为驱动表,因为它更小,可以更快地遍历。

SELECT employees.*, departments.department_name
FROM employees
JOIN departments ON employees.department_id = departments.id
WHERE departments.region = 'Asia';

在这个例子中,尽管employees表在JOIN条件中,但如果departments.region = 'Asia'这个条件能显著减少departments表的结果集,那么优化器可能会选择departments作为驱动表。

2. 单表索引优化

单表索引优化通常涉及为查询中经常作为条件、连接键或排序键的列添加索引。

案例
假设employees表有一个last_name列,经常需要根据员工的姓氏来查询员工信息。

SELECT * FROM employees WHERE last_name = 'Smith';

为了提高这个查询的效率,可以在last_name列上添加索引。

CREATE INDEX idx_last_name ON employees(last_name);
3. 两表索引优化

在两表连接查询中,优化索引可以显著提高性能。通常,应该在连接键和过滤条件上添加索引。

案例
继续上面的employeesdepartments表的例子,如果经常需要根据部门ID和员工的姓氏来查询信息,可以在employees.department_iddepartments.id(如果尚未索引)以及employees.last_name上添加索引。

-- 假设departments.id已经是主键,因此默认有索引
CREATE INDEX idx_emp_dept_id ON employees(department_id);
CREATE INDEX idx_emp_last_name ON employees(last_name);SELECT employees.*, departments.department_name
FROM employees
JOIN departments ON employees.department_id = departments.id
WHERE employees.last_name = 'Smith';
4. 三表及以上索引优化

对于涉及三个或更多表的连接查询,索引优化的策略与两表类似,但更复杂。通常需要考虑查询中所有表之间的连接键以及过滤条件。

案例
假设还有一个projects表(项目表),其中包含项目信息,每个员工可以参与多个项目。现在需要查询参与特定项目且姓氏为’Smith’的员工及其部门信息。

SELECT employees.*, departments.department_name, projects.project_name
FROM employees
JOIN departments ON employees.department_id = departments.id
JOIN projects ON employees.id = projects.employee_id
WHERE employees.last_name = 'Smith' AND projects.project_name = 'ProjectX';

为了优化这个查询,可以在employees.department_idemployees.id(如果尚未作为主键索引)、employees.last_nameprojects.employee_id以及projects.project_name上添加索引。

-- 假设employees.id和departments.id已经是主键,因此默认有索引
CREATE INDEX idx_emp_dept_id ON employees(department_id);
CREATE INDEX idx_emp_last_name ON employees(last_name);
CREATE INDEX idx_proj_emp_id ON projects(employee_id);
CREATE INDEX idx_proj_name ON projects(project_name);

注意:虽然索引可以显著提高查询性能,但它们也会占用额外的磁盘空间,并且会降低写操作的性能(如INSERT、UPDATE、DELETE)。因此,在设计索引时需要权衡这些因素。

索引失效分析
序号场景说明
1最佳左前缀法则复合索引中,查询条件需要按照索引列的顺序进行
2避免在索引字段上做计算WHERE YEAR(column) = 2023,这会导致索引失效
3避免在索引字段上做范围查询范围查询后的列将无法使用索引(如WHERE a > 10 AND b = 2
4查询字段和索引字段尽量一致避免使用SELECT *,尽量只选择需要的列
5慎用IS NULL和IS NOT NULL对于索引列,这些条件可能导致索引失效
6LIKE的前后模糊匹配LIKE '%keyword%',这将导致索引失效,但LIKE 'keyword%'则有效
7使用UNION或UNION ALL代替OR在某些情况下,UNION/UNION ALL可以更有效地利用索引

八、SQL优化

序号内容说明
1SQL语句优化提供SQL语句优化的方法和技巧
序号内容说明
1ORDER BY之前先使用WHERE等条件过滤掉不需要排序的数据,减少排序的数据量
2WHERE和ORDER BY所用到的索引尽量使用索引来加速WHERE和ORDER BY的操作
3排序的方向必须一致如果WHERE条件中使用了索引的某一列进行排序,确保排序方向一致
SQL语句优化
  • 避免SELECT * :尽量指定需要查询的列,减少数据传输量。
  • 使用表连接代替子查询:在可能的情况下,使用JOIN代替子查询可以提高查询效率。
  • 优化WHERE子句:确保WHERE子句中的条件能够利用索引。
  • 使用LIMIT限制结果集:如果只需要部分数据,使用LIMIT来减少处理的数据量。
  • 合理使用聚合函数:聚合函数(如SUM, COUNT, AVG等)

九、额外优化技术

序号内容说明
1截取查询分析分析慢查询日志,优化大量数据插入等场景
2开启慢SQL查询日志监控并优化慢查询
3show profile使用MySQL的show profile命令分析查询性能

相关文章:

一篇就够mysql高阶知识总结

一、事务的ACID原则 序号原则说明1原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做2一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一…...

CTF-Web习题:[BJDCTF2020]ZJCTF,不过如此

题目链接:[BJDCTF2020]ZJCTF,不过如此 解题思路 访问靶场链接,出现的是一段php源码,接下来做一下代码审阅,发现这是一道涉及文件包含的题 主要PHP代码语义: file_get_contents($text,r); 把$text变量所…...

【IEEE出版】第四届能源工程与电力系统国际学术会议(EEPS 2024)

第四届能源工程与电力系统国际学术会议(EEPS 2024) 2024 4th International Conference on Energy Engineering and Power Systems 重要信息 大会官网:www.iceeps.com 大会时间:2024年8月9-11日 大会…...

浅谈Vue:text-align: center、align-items: center、justify-content: center三种居中的区别和用法

text-align: center、align-items: center 和 justify-content: center 是用于不同布局场景下的CSS属性。它们在水平和垂直居中元素方面有所不同,具体取决于你使用的布局模型(如块级元素、Flexbox、Grid)。以下是它们的区别和适用场景&#x…...

理解UI设计:UI设计师的未来发展机遇

UI设计师的出现是互联网时代的设计变革。随着移动互联网的快速发展,移动产品设计师非常短缺。高薪资让许多其他行业的设计师已经转向了UI设计。那么什么是UI设计呢?UI设计师负责什么?UI设计的发展趋势和就业前景如何?这些都是许多…...

关键字 internal

在C#中,internal 关键字是一个访问修饰符,它用于限制类型或类型成员的访问性。当一个类型(类、结构体、接口、枚举等)或类型成员(字段、属性、方法、事件等)被声明为 internal 时,它只能在同一程…...

C学习(数据结构)-->单链表习题

目录 一、环形链表 题一:环形链表 思路: 思考一:为什么? 思考二:快指针一次走3步、4步、......n步,能否相遇 step1: step2: 代码: 题二: 环形链表 I…...

MATLAB6:M文件和控制流

文章目录 一、实验目的二、实验内容三、仿真结果四、实践中遇到的问题及解决方法 一、实验目的 1. 熟悉运用MATLAB的控制指令。   2. 理解M脚本文件和函数文件的本质区别。   3. 能够运用所学知识,编制程序解决一般的计算问题。 二、实验内容 1.for循环结构及注…...

网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术

网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术 在当今的大数据时代,网络爬虫技术已经成为获取信息的重要手段之一。Python凭借其强大的库支持,成为了进行网页数据抓取的首选语言。在众多的爬虫库中,BeautifulSoup和Scrap…...

Linux应用——网络基础

一、网络结构模型 1.1C/S结构 C/S结构——服务器与客户机; CS结构通常采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器,服务器则是提供信息供人访问的计算机。 例如&…...

白骑士的C++教学实战项目篇 4.3 多线程网络服务器

系列目录 上一篇:白骑士的C教学实战项目篇 4.2 学生成绩管理系统 在这一节中,我们将实现一个多线程网络服务器项目,通过该项目,我们将学习套接字编程的基础知识以及如何使用多线程处理并发连接。此外,我们还将实现一个…...

Go语言并发编程-Context上下文

Context上下文 Context概述 Go 1.7 标准库引入 context,译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息,包括:取…...

React@16.x(62)Redux@4.x(11)- 中间件2 - redux-thunk

目录 1,介绍举例 2,原理和实现实现 3,注意点 1,介绍 一般情况下,action 是一个平面对象,并会通过纯函数来创建。 export const createAddUserAction (user) > ({type: ADD_USER,payload: user, });这…...

【Qt】QTcpServer/QTcpSocket通信

这里写目录标题 1.pro文件2.服务器3.客户端 1.pro文件 QT network2.服务器 h文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> #include <QTcpSocket>QT_BEGIN_NAMESPACE namespace Ui { class MainW…...

【时时三省】单元测试 简介

目录 1,单元测试简介 2,单元测试的目的 3,单元测试检查范围 4,单元测试用例设计方法 5,单元测试判断通过标准 6,测试范围 7,测试频率 8,输出成果 经验建议: 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,单元测试简介 单元测试在以V模型…...

中间件——Kafka

两个系统各自都有各自要去做的事&#xff0c;所以只能将消息放到一个中间平台&#xff08;中间件&#xff09; Kafka 分布式流媒体平台 程序发消息&#xff0c;程序接收消息 Producer&#xff1a;Producer即生产者&#xff0c;消息的产生者&#xff0c;是消息的入口。 Brok…...

中介者模式(行为型)

目录 一、前言 二、中介者模式 三、总结 一、前言 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;又成为调停者模式&#xff0c;用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用&#xff0c;从而使其耦合…...

定个小目标之刷LeetCode热题(45)

32. 最长有效括号 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号 子串的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输出&#xff1a;2 解释&#xff1a;最长有效括号子串是 "()"有事…...

golang 实现负载均衡器-负载均衡原理介绍

go 实现负载均衡器 文章目录 go 实现负载均衡器代码实现介绍负载均衡的核心组件与工作流程核心组件工作流程 总结 算法详细描述&#xff1a;1. 轮询&#xff08;Round Robin&#xff09;2. 最少连接&#xff08;Least Connections&#xff09;3. IP散列&#xff08;IP Hash&…...

spring是如何解决循环依赖的,为什么不是两级

1. Spring使用三级缓存来解决循环依赖问题 Spring使用三级缓存来解决循环依赖问题&#xff0c;‌而不是使用两级缓存。‌ 在Spring框架中&#xff0c;‌解决循环依赖的关键在于正确地管理Bean的生命周期和依赖关系。‌循环依赖指的是两个或多个Bean相互依赖&#xff0c;‌如果…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...