MySql历史与架构
2024-10-19 08:12:31
MySQL 逻辑架构
连接管理与安全性
每个客户端连接都会有一个线程
认证基于用户名,原始主机信息和密码
优化与执行
Mysql会解析查询并进行优化
对于select会先检查查询缓存,能够找到就直接返回结果集
并发控制
读写锁
锁在COMMIT或ROLLBACK时自动释放
读锁(共享锁)
共享,不阻塞,多个用户可以同时读同一个资源
写锁(独占锁)
保证只有一个用户写入,防止其他用户写入或读取数据
锁粒度
加锁,锁的检查,锁的解除都是要消耗系统资源的
加锁的对象大小成为锁粒度
锁策略
在锁的开销与数据的安全性中寻求平衡
行锁
最大程度支持并发,MySQL服务器层没有实现,由存储引擎实现
表锁
开销最小
MySQL服务器可以根据自己的目的加上表锁而忽略存储引擎的锁机制
事务
一组原子性的SQL语句,要么全部执行,要么全部不执行
ACID
- 原子性: 要么全部执行,要么全部不执行
- 一致性: 状态的改变是完全的,不存在改变一半就被保存的情况
- 隔离性: 在提交前对其他事务不可见
- 持久性: 数据更改会永远保存
隔离级别
未提交读(Read Uncommited)
即使事务未曾提交,数据对于其他事务也是可见的.即事务可以读取未提交的数据,也叫脏读或读脏数据
可提交读
即一个事务在提交之前,改变对其他事务是不可见的,又叫不可重复读,幻读(在一个事务读取数据后还未提交时,另一个事务更改了数据)
可重复读
解决了幻读和脏读的问题
可串行化
强制事务串行执行,给每一行数据加锁
死锁
死锁指两个或多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,从而造成的恶性循环
死锁发生后,只能通过部分或完全回滚事务才能解决
例子
事务日志
好处
- 避免频繁从内存向磁盘中写入数据(可以记录下日志操作,在后台慢慢一次写入,所以日志文件是追加写)
- 便于出现故障后的恢复
Mysql中的事务
自动提交(AUTOCOMMIT)
混合使用多种存储引擎
InnoDB: 支持事务
MyISAM: 不支持事务
不支持事务的表回滚不能撤销更改
隐式和显式锁定
显式: 自动加锁
隐式: 主动加锁
多版本并发控制(MVCC)
- 一个列保存了创建时间,一个列保存删除时间(时间指版本号)
- 每开始一个新的事务,系统版本号都会递增,并把事务开始时的版本号作为事务的版本号,供与查询到的每行版本号相匹配
MySql存储引擎
- 表的定义存储在.frm文件中
- 通过show table status 'tableName'查看表的相关定义信息
InnoDB
是MySql的默认事务型引擎,也是使用最广泛的存储引擎,被设计用来处理大量短期事务
- 数据存储在表空间中
- 采用MVCC实现并发,实现四种隔离级别,默认可重复读
- 基于聚簇索引(第二索引必须包含主键)建立
MyISAM
缺点
- 不支持事务和行级锁
- 数据库崩溃后无法安全恢复
特性
- 对整张表加锁,而不是针对行,但在读取数据的时候依然可以插入新的数据(并发插入)
- 延迟更新索引键
其他引擎
CSV
用于转化.csv文件成数据库里的表
Memory
Archive
第三方引擎
选择合适的引擎
除非用到某些InnoDB不具备的特性,并且没有其他办法可以替代,否则都应该优先选择InnoDB引擎
最好不要混用多种存储引擎!!!
更换表的引擎
ALTER TABLE
ALTER Table name Engine = InnoDB
导入与导出
创建与查询
最新文章
- NumPy 学习(3): 通用函数
- JavaScript 札记(数据类型和变量、)
- python 列表函数(转)
- 建立tracert路由列表的方法
- C语言初学 比较五个整数并输出最大值和最小值2
- jQuery Mobile 自定义按钮图标
- SwingBench---ORACLE压力测试工具
- Git提交到github上
- ADO.NET复习总结(2)--连接池
- Android 启动优化
- linux 如何截取一段时间内log日志
- python3: 爬虫---- urllib, beautifulsoup
- 基于MVC 的Quartz.Net组件实现的定时执行任务调度
- Vijos 1360 - 八数码问题 - [A*]
- C# semphore的使用
- 安装python的jupyter notebook工具
- C++委托模式
- Modelsim se仿真Xilinx IPcore
- BZOJ3601. 一个人的数论(狄利克雷卷积+高斯消元)及关于「前 $n$ 个正整数的 $k$ 次幂之和是关于 $n$ 的 $k+1$ 次多项式」的证明
- 2016.5.16——leetcode:Reverse Bits(超详细讲解)
热门文章
- Nginx基础 - HTTPS安全web服务
- printf,sprintf,fprintf的区别与联系
- Linux 驱动框架---驱动中的时间相关
- 基于vue3.0+electron新开窗口|Electron多开窗体|父子模态窗口
- CSS字体大小: em与px、pt、百分比之间的对比
- 如何在github中插入图片,链接,图片链接(给图片加上链接),文字+图片链接,的实战分享!
- 2020 Google 开发者大会
- HTML spaces types: &;nbsp; &; &;emsp; &; &;ensp;
- write a node cli tools, step by step
- how to fetch html content in js