读高性能MySQL(第4版)笔记01_MySQL架构(上)

news2024/11/23 1:27:39

 

1. 逻辑架构

1.1. 大多数基于网络的客户端/服务器工具或服务器都有类似的服务

1.1.1. 连接处理

1.1.2. 身份验证

1.1.3. 确保安全性

1.2. 核心层

1.2.1. 查询解析、分析、优化、以及所有的内置函数

1.2.2. 跨存储引擎的功能

1.2.2.1. 存储过程

1.2.2.2. 触发器

1.2.2.3. 视图

1.3. 存储引擎层

1.3.1. 存储引擎负责MySQL中数据的存储和提取

1.3.2. 和GNU/Linux下的各种文件系统一样,每种存储引擎都有其优势和劣势

1.3.3. 优化器并不关心表使用的是什么存储引擎,但存储引擎对于查询优化是有影响的

2. 查询缓存

2.1. query cache

2.2. 随着并发性的增加,查询缓存成为一个让人诟病的瓶颈

2.3. MySQL 5.7.20版本开始,查询缓存已经被官方标注为被弃用的特性

2.4. 在8.0版本中被完全移除

2.5. 缓存被频繁请求的结果集依然是一个很好的实践

2.5.1. 一个流行的设计模式是在memcached或Redis中缓存数据

3. 并发控制

3.1. 只要有多个查询需要同时修改数据,就会产生并发控制问题

3.2. 并发控制的级别

3.2.1. 服务器级别

3.2.2. 存储引擎级别

3.3. 读写锁

3.3.1. 从电子表格中读取数据不会有什么麻烦,即使很多人同时读取也不会有问题

3.3.2. 读锁(read lock)

3.3.2.1. 共享锁(shared lock)

3.3.2.2. 资源上的读锁是共享的,或者说是相互不阻塞的

3.3.3. 写锁(write lock)

3.3.3.1. 排他锁(exclusive lock)

3.3.3.2. 写锁则是排他的,也就是说,一个写锁既会阻塞读锁也会阻塞其他的写锁

3.3.3.3. 只有这样才能确保在特定的时间点只有一个客户端能执行写入,并防止其他客户端读取正在写入的资源

3.3.3.3.1. 这是出于安全策略的考虑

3.3.4. 处理并发读/写访问的系统通常实现一个由两种锁类型组成的锁系统

3.3.5. 在实际的数据库系统中,每时每刻都在发生锁定

3.3.6. 如果数据库服务器以可接受的方式执行,锁的管理速度足够快,那么不会引起客户端的感知

3.3.7. 锁是数据库实现一致性保证的方法

3.4. 锁的粒度

3.4.1. 一种提高共享资源并发性的方式就是让锁定对象更有选择性

3.4.2. 尽量只锁定包含需要修改的部分数据,而不是所有的资源

3.4.3. 只对需要修改的数据片段进行精确的锁定

3.4.4. 让锁定的数据量最小化,理论上就能保证在给定资源上同时进行更改操作,只要被修改的数据彼此不冲突即可

3.4.5. 如果系统花费大量的时间来管理锁,而不是存取数据,那么系统的性能可能会受影响

3.5. 锁策略

3.5.1. 锁定策略是锁开销和数据安全性之间的平衡,这种平衡会影响性能

3.5.2. 表锁(table lock)

3.5.2.1. MySQL中最基本也是开销最小的锁策略

3.5.2.2. 它会锁定整张表

3.5.2.2.1. 只有没有人执行写操作时,其他读取的客户端才能获得读锁,读锁之间不会相互阻塞

3.5.2.3. 写锁队列和读锁队列是分开的,但写锁队列的优先级绝对高于读队列

3.5.3. 行级锁(row lock)

3.5.3.1. 行级锁是在存储引擎而不是服务器中实现的

3.5.3.2. 可以最大程度地支持并发处理(也带来了最大的锁开销)

3.5.3.3. 允许多人同时编辑不同的行,而不会阻塞彼此

3.5.3.4. 一般都是在表中施加行级锁(row level lock),为了在锁比较多的情况下尽可能地提供更好的性能,锁的实现方式非常复杂

3.5.3.5. 服务器可以执行更多的并发写操作

3.5.3.6. 代价是需要承担更多开销

3.5.3.6.1. 跟踪谁拥有这些行级锁
3.5.3.6.2. 已经锁定了多长时间
3.5.3.6.3. 行级锁的类型
3.5.3.6.4. 何时该清理不再需要的行级锁

4. 事务

4.1. 事务就是一组SQL语句,作为一个工作单元以原子方式进行处理

4.2. 作为事务的一组语句,要么全部执行成功,要么全部执行失败

4.3. 存在高度复杂且缓慢的两阶段提交系统的典型原因

4.3.1. 为了应对各种失败场景

4.3.1.1. 连接可能会断开

4.3.1.2. 会超时

4.3.1.3. 数据库服务器在操作执行过程中会崩溃

4.4. ACID

4.4.1. 原子性(atomicity)

4.4.1.1. 一个事务必须被视为一个不可分割的工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚

4.4.2. 一致性(consistency)

4.4.2.1. 数据库总是从一个一致性状态转换到下一个一致性状态

4.4.3. 隔离性(isolation)

4.4.3.1. 一个事务所做的修改在最终提交以前,对其他事务是不可见的,这就是隔离性带来的结果

4.4.4. 持久性(durability)

4.4.4.1. 一旦提交,事务所做的修改就会被永久保存到数据库中

4.4.4.2. 不可能有100%的持久性保障

4.4.4.3. 如果数据库本身就能做到真正的持久性,那么备份又怎么能增加持久性?

4.4.5. ACID事务和InnoDB引擎提供的保证是MySQL中最强大、最成熟的特性之一

4.4.6. 除非系统通过严格的ACID测试,否则空谈事务的概念是不够的

4.5. 隔离级别

4.5.1. READ UNCOMMITTED(未提交读)

4.5.1.1. 在事务中可以查看其他事务中还没有提交的修改

4.5.1.2. 从性能上来说,READ UNCOMMITTED不会比其他级别好太多,却缺乏其他级别的很多好处

4.5.1.3. 在实际应用中一般很少使用

4.5.1.4. 读取未提交的数据,也称为脏读(dirty read)

4.5.2. READ COMMITTED(提交读)

4.5.2.1. 大多数数据库系统的默认隔离级别是READ   COMMITTED

4.5.2.1.1. MySQL不是

4.5.2.2. 一个事务可以看到其他事务在它开始之后提交的修改

4.5.2.3. 在该事务提交之前,其所做的任何修改对其他事务都是不可见的

4.5.2.4. 允许不可重复读(nonrepeatable read)

4.5.2.4.1. 这意味着同一事务中两次执行相同语句,可能会看到不同的数据结果

4.5.3. REPEATABLE READ(可重复读)

4.5.3.1. MySQL默认的事务隔离级别

4.5.3.2. 保证了在同一个事务中多次读取相同行数据的结果是一样的

4.5.3.3. 无法解决另外一个幻读(phantom read)

4.5.3.4. 幻读指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(phantom row)

4.5.3.5. InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)解决了幻读的问题

4.5.4. SERIALIZABLE(可串行化)

4.5.4.1. 最高的隔离级别

4.5.4.2. 通过强制事务按序执行,使不同事务之间不可能产生冲突,从而解决了幻读问题

4.5.4.3. 实际应用中很少用到这个隔离级别,除非需要严格确保数据安全且可以接受并发性能下降的结果

4.5.5. 隔离级别之间的利与弊

5. 死锁

5.1. 两个或多个事务相互持有和请求相同资源上的锁,产生了循环依赖

5.2. InnoDB存储引擎,检测到循环依赖后会立即返回一个错误信息

5.2.1. 死锁将表现为非常缓慢的查询

5.3. 一旦发生死锁,如果不回滚其中一个事务(部分或全部),就无法打破死锁

5.4. InnoDB目前处理死锁的方式是将持有最少行级排他锁的事务回滚

5.4.1. 这是一种最容易回滚的近似算法

5.5. 死锁的产生有双重原因

5.5.1. 真正的数据冲突,这种情况通常很难避免

5.5.2. 完全是由于存储引擎的实现方式导致的

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

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

相关文章

kafka的位移

文章目录 概要消费位移__consumer_offsets主题位移提交 概要 本文主要总结kafka的位移是如何管理的,在broker端如何通过命令行查看到位移信息,并从代码层面总结了位移的提交方式。 消费位移 对于 Kafka 中的分区而言,它的每条消息都有唯一…

Python爬虫(十二)_XPath与lxml类库

Python学习指南 有同学说,我正则用的不好,处理HTML文档很累,有没有其他的方法? 有!那就是XPath,我们可以用先将HTML文档转换成XML文档,然后用XPath查找HTML节点或元素。 什么是XML XML指可扩展标记语言(E…

Spring Boot + Vue3前后端分离实战wiki知识库系统十二--用户管理单点登录开发一...

目标: 在上一次https://www.cnblogs.com/webor2006/p/17533745.html我们已经完成了文档管理的功能模块开发,接下来则开启新模块的学习---用户登录,这块还是有不少知识点值得学习的,先来看一下整体的效果,关于效果官网有…

算法|Day38 动态规划6

完全背包问题,也就是一个物品可以取多次,我们只需要正序遍历背包容量就可以了。因为一维数组是按左边的状态来进行推导,我们正序,那样就会将前一次取的状态带到下一个位置,也就实现了多次取。如果倒序,左边…

麦肯锡发布《2023科技趋势展望报告》,生成式AI、下一代软件开发成为趋势,软件测试如何贴合趋势?

近日,麦肯锡公司发布了《2023科技趋势展望报告》。报告列出了15个趋势,并把他们分为5大类,人工智能革命、构建数字未来、计算和连接的前沿、尖端工程技术和可持续发展。 类别一:人工智能革命 生成式AI 生成型人工智能标志着人工智…

(el-Table)操作(不使用 ts):Element-plus 中Table 表格组件:多选修改成支持单选及表格相关样式的调整

Ⅰ、Element-plus 提供的 Table 表格组件与想要目标情况的对比: 1、Element-plus 提供 Table 组件情况: 其一、Element-ui 自提供的 Table 代码情况为(示例的代码): // Element-plus 自提供的代码: // 此时是使用了 ts 语言环境…

Windows11中使用OneDrive按Print Screen截屏按键,把截图自动保存到OneDrive中

参考:关于Onedrive 我已经勾选了自动保存屏幕截图 但是我截图之后我的图片并没有上传到onedrive上面 - Microsoft Community 1. 打开Windows 11的设置,可以通过按下Win I键来快速打开设置; 2. 设置--辅助功能--键盘--使用”print Screen“键…

Rust 重载运算符|复数结构的“加减乘除”四则运算

复数 基本概念 复数定义 由实数部分和虚数部分所组成的数,形如a+bi 。 其中a、b为实数,i 为“虚数单位”,i -1,即虚数单位的平方等于-1。 a、b分别叫做复数a+bi的实部和虚部。 当b0时,a&…

codeforces代:

感受思维的美丽,abcde题目的思路是怎么样的: 上蓝 上紫 可以代 :有问题可以评论区 直接问我 也可以q: 639682754

【严重】Smartbi未授权设置Token回调地址获取管理员权限

漏洞描述 Smartbi是一款商业智能应用,提供了数据集成、分析、可视化等功能,帮助用户理解和使用他们的数据进行决策。 在 Smartbi 受影响版本中存在Token回调地址漏洞,未授权的攻击者可以通过向目标系统发送POST请求/smartbix/api/monitor/s…

python_PyQt5运行股票研究python方法工具V1.0

写在前面: 1 在写研究方法过程中(例如:股票研究),很多方法根据数据的更新需要重复运行获取新的结果,本工具就是固化这些需要重复运行的代码,可以直接在工具中运行得到更新的结果。 2 本文是V1…

并发编程系列-Semaphore

Semaphore,如今通常被翻译为"信号量",过去也曾被翻译为"信号灯",因为类似于现实生活中的红绿灯,车辆是否能通行取决于是否是绿灯。同样,在编程世界中,线程是否能执行取决于信号量是否允…

DevOps?自动化运维!

by: 雪月三十 DevOps流程图 DevOps介绍 命名 DevOps是Dev和Ops的结合 Dev(developer开发) Ops(operation运维) 矛盾 在企业中dev和ops是有一种天然的矛盾,dev要求的是快速迭代,给公司挖掘出商业的价值…

c++实现多进程执行多个shell脚本

一 参考 system()、exec()、fork()三个与进程有关的函数的比较 - 青儿哥哥 - 博客园 (cnblogs.com)https://www.cnblogs.com/qingergege/p/6601807.htmlfork执行流程分析_fork子进程和父进程执行顺序_cytf的博客-CSDN博客https://blog.csdn.net/qq_27420299/articl

IE实验-Qos教学实验

S1 diffserv domain boss //创建差分服务域 8021p-inbound 0 phb ef green //将外部优先级为0的流量,映射到内部优先级ef interface GigabitEthernet0/0/2 trust upstream boss //在接口下调用查分服务域 trust dscp override qos map-table dscp-dscp acl …

【新品发布】ChatWork企业知识库系统源码

系统简介 基于前后端分离架构以及Vue3、uni-app、ThinkPHP6.x、PostgreSQL、pgvector技术栈开发,包含PC端、H5端。 ChatWork支持问答式和文档式知识库,能够导入txt、doc、docx、pdf、md等多种格式文档。 导入数据完成向量化训练后,用户提问…

小米发布会:雷军成长故事与创新壮举,AI大模型技术引领未来,雷军探索之路之从创业波折到小米AI领航,成就高端化传奇!

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

基于物理场的动态模式分解(piDMD)研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

翻转二叉树

声明 该系列文章仅仅展示个人的解题思路和分析过程,并非一定是优质题解,重要的是通过分析和解决问题能让我们逐渐熟练和成长,从新手到大佬离不开一个磨练的过程,加油! 原题链接 翻转二叉树备战技术面试?…

shell之正则表达式及三剑客grep命令

一、正则表达式概述 什么是正则表达式? 正则表达式是一种描述字符串匹配规则的重要工具 1、正则表达式定义: 正则表达式,又称正规表达式、常规表达式 使用字符串描述、匹配一系列符合某个规则的字符串 正则表达式 普通字符: 大小写字母…