一篇就够mysql高阶知识总结
一、事务的ACID原则
序号 | 原则 | 说明 |
---|---|---|
1 | 原子性(Atomicity) | 事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做 |
2 | 一致性(Consistency) | 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态 |
3 | 隔离性(Isolation) | 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰 |
4 | 持久性(Durability) | 持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其有任何影响 |
二、数据库设计的三大范式
序号 | 范式 | 说明 |
---|---|---|
1 | 第一范式(1NF) | 确保每列保持原子性 |
2 | 第二范式(2NF) | 在满足第一范式的前提下,非主属性完全依赖于码 |
3 | 第三范式(3NF) | 在满足第二范式的前提下,非主属性不传递依赖于码 |
三、索引
序号 | 索引类型 | 说明 |
---|---|---|
1 | 二叉树搜索树 | 基础数据结构,用于快速查找、插入和删除 |
2 | 红黑树 | 平衡二叉搜索树,保持树的平衡以维持操作的高效性 |
3 | B树 | 适用于大量数据的磁盘读写操作,保持树的平衡 |
4 | B+树 | B树的变种,非叶子节点不存储数据,更适合作为数据库索引结构 |
5 | 索引概念 | 数据库中用于提高数据检索效率的数据结构 |
四、SQL解析
序号 | 内容 | 说明 |
---|---|---|
1 | SQL解析 | SQL语句被数据库管理系统解析、编译和执行的过程 |
五、锁机制
序号 | 锁类型 | 说明 |
---|---|---|
1 | 行锁 | 锁定一行数据 |
2 | 表锁 | 锁定整个表 |
3 | 范围锁 | 锁定一定范围的数据 |
4 | 悲观锁 | 假设最坏情况,数据在修改前会被锁定 |
5 | 乐观锁 | 假设最好的情况,只在更新操作时检查数据是否被其他事务修改 |
6 | 读写锁 | 分为读锁和写锁,读锁允许多个读操作并发,写锁则独占 |
六、JOIN查询
序号 | 内容 | 说明 |
---|---|---|
1 | 7种常见的JOIN查询 | 包括INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN等 |
2 | SQL语句 | 展示具体的SQL JOIN查询语句 |
3-9 | 每种JOIN查询的说明与示例 | 分别解释每种JOIN的用法及示例 |
10 | Union和Union All | 介绍UNION和UNION ALL的区别及使用场景 |
七、索引优化
序号 | 内容 | 说明 |
---|---|---|
1 | 索引分类 | 单值索引、唯一索引、主键索引、复合索引 |
2 | Explain性能分析 | 使用EXPLAIN分析SQL查询性能 |
3 | 索引优化入门案例 | 展示不同场景下的索引优化案例 |
4 | 索引失效分析 | 分析导致索引失效的常见场景 |
5 | 分组排序优化 | 优化ORDER BY和GROUP BY的性能 |
索引分类
序号 | 索引类型 | 说明 |
---|---|---|
1 | 单值索引 | 索引列中的单个值 |
2 | 唯一索引 | 索引列中的值必须是唯一的,允许NULL值但最多只能有一个 |
3 | 主键索引 | 特殊的唯一索引,一个表只能有一个主键,且不允许NULL值 |
4 | 复合索引(组合索引) | 索引由两个或两个以上的列组成,列的组合值必须唯一或满足特定条件 |
Explain性能分析
序号 | 字段 | 说明 |
---|---|---|
1 | sql | 执行的SQL语句 |
2 | id | SELECT的标识符,如果查询包含子查询,则会出现多个id |
3 | select_type | SELECT的类型(SIMPLE, PRIMARY, SUBQUERY等) |
4 | table | 输出行所引用的表 |
5 | type | 连接类型(ALL, index, range, ref, eq_ref, const/system等) |
6 | possible_keys | 显示可能应用在这张表上的索引,但不一定实际使用 |
7 | key | 实际使用的索引 |
8 | key_len | 使用的索引的长度 |
9 | ref | 显示索引的哪一列或常数被用于查找值 |
10 | rows | MySQL认为必须检查的用来返回请求数据的行数估计值 |
11 | Extra | 包含不适合在其他列中显示但十分重要的额外信息,如是否使用索引等 |
索引优化入门案例
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. 两表索引优化
在两表连接查询中,优化索引可以显著提高性能。通常,应该在连接键和过滤条件上添加索引。
案例:
继续上面的employees
和departments
表的例子,如果经常需要根据部门ID和员工的姓氏来查询信息,可以在employees.department_id
和departments.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_id
、employees.id
(如果尚未作为主键索引)、employees.last_name
、projects.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 | 对于索引列,这些条件可能导致索引失效 |
6 | LIKE的前后模糊匹配 | 如LIKE '%keyword%' ,这将导致索引失效,但LIKE 'keyword%' 则有效 |
7 | 使用UNION或UNION ALL代替OR | 在某些情况下,UNION/UNION ALL可以更有效地利用索引 |
八、SQL优化
序号 | 内容 | 说明 |
---|---|---|
1 | SQL语句优化 | 提供SQL语句优化的方法和技巧 |
序号 | 内容 | 说明 |
---|---|---|
1 | ORDER BY之前先使用WHERE等条件 | 过滤掉不需要排序的数据,减少排序的数据量 |
2 | WHERE和ORDER BY所用到的索引 | 尽量使用索引来加速WHERE和ORDER BY的操作 |
3 | 排序的方向必须一致 | 如果WHERE条件中使用了索引的某一列进行排序,确保排序方向一致 |
SQL语句优化
- 避免SELECT * :尽量指定需要查询的列,减少数据传输量。
- 使用表连接代替子查询:在可能的情况下,使用JOIN代替子查询可以提高查询效率。
- 优化WHERE子句:确保WHERE子句中的条件能够利用索引。
- 使用LIMIT限制结果集:如果只需要部分数据,使用LIMIT来减少处理的数据量。
- 合理使用聚合函数:聚合函数(如SUM, COUNT, AVG等)
九、额外优化技术
序号 | 内容 | 说明 |
---|---|---|
1 | 截取查询分析 | 分析慢查询日志,优化大量数据插入等场景 |
2 | 开启慢SQL查询日志 | 监控并优化慢查询 |
3 | show 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
两个系统各自都有各自要去做的事,所以只能将消息放到一个中间平台(中间件) Kafka 分布式流媒体平台 程序发消息,程序接收消息 Producer:Producer即生产者,消息的产生者,是消息的入口。 Brok…...
中介者模式(行为型)
目录 一、前言 二、中介者模式 三、总结 一、前言 中介者模式(Mediator Pattern)是一种行为型设计模式,又成为调停者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合…...
定个小目标之刷LeetCode热题(45)
32. 最长有效括号 给你一个只包含 ( 和 ) 的字符串,找出最长有效(格式正确且连续)括号 子串的长度。 示例 1: 输入:s "(()" 输出:2 解释:最长有效括号子串是 "()"有事…...
golang 实现负载均衡器-负载均衡原理介绍
go 实现负载均衡器 文章目录 go 实现负载均衡器代码实现介绍负载均衡的核心组件与工作流程核心组件工作流程 总结 算法详细描述:1. 轮询(Round Robin)2. 最少连接(Least Connections)3. IP散列(IP Hash&…...
spring是如何解决循环依赖的,为什么不是两级
1. Spring使用三级缓存来解决循环依赖问题 Spring使用三级缓存来解决循环依赖问题,而不是使用两级缓存。 在Spring框架中,解决循环依赖的关键在于正确地管理Bean的生命周期和依赖关系。循环依赖指的是两个或多个Bean相互依赖,如果…...
大模型预训练优化参数设置
文章目录 基于批次数据的训练学习率优化器稳定优化技术与传统神经网络的优化类似,通常使用批次梯度下降算法来进行模型参数的调优。同时,通过调整学习率以及优化器中的梯度修正策略,可以进一步提升训练的稳定性。为了防止模型对数据产生过度拟合,训练中还需要引入一系列正则…...
PHP pwn 学习 (2)
文章目录 A. 逆向分析A.1 基本数据获取A.2 函数逆向zif_addHackerzif_removeHackerzif_displayHackerzif_editHacker A.3 PHP 内存分配 A.4 漏洞挖掘B. 漏洞利用B.1 PHP调试B.2 exp 上一篇blog中,我们学习了一些PHP extension for C的基本内容,下面结合一…...
【Python学习笔记】:Python爬取音频
【Python学习笔记】:Python爬取音频 背景前摇(省流可以不看): 人工智能公司实习,好奇技术老师训练语音模型的过程,遂请教,得知训练数据集来源于爬取某网页的音频。 很久以前看B站同济子豪兄的《…...
4 C 语言控制流与循环结构的深入解读
目录 1 复杂表达式的计算过程 2 if-else语句 2.1 基本结构及示例 2.2 if-else if 多分支 2.3 嵌套 if-else 2.4 悬空的 else 2.5 注意事项 2.5.1 if 后面不要加分号 2.5.2 省略 else 2.5.3 省略 {} 2.5.4 注意点 3 while 循环 3.1 一般形式 3.2 流程特点 3.3 注…...
vue排序
onEnd 函数示例,它假设 drag.value 是一个包含多个对象(每个对象至少包含 orderNum 和 label 属性)的数组,且您希望在拖动结束后更新所有元素的 orderNum 以反映新的顺序: function onEnd(e) { // 首先,确…...
agv叉车slam定位精度测试标准化流程
相对定位精度 条件:1.5m/s最高速度;基于普通直行任务 数据采集(3个不同位置的直行任务,每个任务直行约10m,每个10次) 测量每次走过的实际距离,与每次根据定位结果算得的相对距离,两…...
实战打靶集锦-31-monitoring
文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 ssh服务4.2 smtp服务4.3 http/https服务 5. 系统提权5.1 枚举系统信息5.2 枚举passwd文件5.3 枚举定时任务5.4 linpeas提权 6. 获取flag 靶机地址:https://download.vulnhub.com/monitoring/Monitoring.o…...
小程序-模板与配置
一、WXML模板语法 1.数据绑定 2.事件绑定 什么是事件 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理函数中为data中的数据赋值 3.事件传参与数据同步 事件传参 (以下为错误示例) 以上两者的…...
交叉编译aarch64的Qt5.12.2,附带Mysql插件编译
一、配置交叉编译工具链 1、交叉编译工具链目录 /opt/zlg/m3568-sdk-v1.0.0-ga/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu/bin/aarch64-rockchip-linux-gnu-g /opt/zlg/m3568-sdk-v1.0.0-ga/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linu…...
好用的Ubuntu下的工具合集[持续增加]
1. 终端工具 UBUNTU下有哪些好用的终端软件? - 知乎 (zhihu.com) sudo apt install terminator...
做网站和游戏是如何赚钱/百度排名服务
实现了一个简单的char二维数组函数,传入二维数组,打印二维数组的内容。 #include <cstdio>#define VEINKAPI __callback #define IN typedef int YNHANDLE;VEINKAPI void PrepareList(IN int fingercount, IN char **fingerlist, IN char** nameli…...
p2p贷款网站开发/网站seo优化总结
/*S.O.L.I.D五大原则1. 单一原则2. 开闭原则3. 里氏替换原则4. 接口分离原则5. 依赖反转原则 */ /*单一原则:类发生更改的原因只有一个如何知道一个对象的多个行为构造多个职责或单个职责?判断标准:1. 存储对象:提供对象信息给其他…...
wordpress多版/seo诊断
http://code.alibabatech.com/wiki/display/cobar/Home http://tech.it168.com/a2012/0625/1364/000001364072.shtml 概述 Cobar是关系型数据的分布式处理系统,它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务。产品在阿里巴巴B2B公司已经稳定运…...
洛阳高新区做网站公司/公司官网怎么制作
项目 App 的冷启动速度实在太慢了。下面把优化的手段大概总结一下,要说明一点的是,每个项目结构都不一样,实质优化的内容也不一样,但是可以说优化的思路是一样的。Application 优化onCreate 放置的 sdk 或者 单利初始化的东西一定…...
wordpress空间租赁/网络营销的工具和方法
深入理解硬盘的Linux分区在学习Linux的过程中,安装Linux是每一个初学者的第一个门槛。在这个过程中间,最大的困惑莫过于给硬盘进行分区。虽然,现在各种发行版本的Linux已经提供了友好的图形交互界面,但是很多的人还是感觉无从下手…...
怎么用百度云做网站空间/seo怎么做新手入门
如果集合中不存在给定元素,则该集合add()方法会将其添加到集合中。用法:set.add(elem)The add() method doesnt add an element to theset if its already present in it otherwise itwill get added to the set.参数:add() takes single parameter(elem…...