Mysql架构与历史
MySQL逻辑架构
客户端----->线程/进程处理---->(查询缓存<—解析器)->优化器
最上层不是MySql独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。
大多数Mysql的核心服务功能都在第二层,包括查询解析、分析、优化、缓存以及所有内置函数。
第三层包括存储引擎,负责MySQL中数据的存储和提取。
连接管理与安全性
每个客户端连接都会在服务器进程中拥有一个进程,这个连接的查询只会在这个单独的线程中执行。服务器会缓存线程,因此不需要位每一个新建的连接创建或者销毁线程。
优化与执行
MySQL会解析查询,并创建内部数据结构,然后进行各种优化。
并发控制
读写锁
读锁是共享的,相互不阻塞,而写锁是排他的,一个写锁会阻塞其他的写锁和读锁。
锁粒度
- 表锁:最基本的锁,开销最小。
- 行级锁:最大程度的支持并发处理(同时带来了最大的锁开销)
事务
ACID表示:原子性、一致性、隔离性、持久性。
- 原子性:一个事物被视为一个不可分割的最小单元,整个事务要么全部成功要么全部失败。
- 一致性:从一个一致的状态转换到了另一个一致的状态。
- 隔离性:一个失误所做的修改在最终提交之前对其他事物是不可见的。
- 持久性:一旦事务提交,所做的修改就会永久保存在数据库。
隔离级别
四种隔离级别:
- READUNCOMMITED 未提交读
事务的修改,即使没有提交,对其他事物也都是可见的。
- READCOMMITED 提交读
一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。
- REPEATABLE READ 可重复读
同一个事务中多次读取同样的记录是一致的。(会产生幻灯行)MySQL默认的事务隔离级别。
- SERIALIZABLE 可串行化
最高的隔离级别,读取的每一行数据上都加锁。
- 脏读、不可重复读、幻读
死锁
事务日志
使用事务日志,存储引擎在修改表数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中。
MySQL中的事务
两种事务型的存储引擎:InnoDB和NDB CLUSTER。
MYSQL的存储引擎
InnoDB存储引擎
MVCC支持高并发,实现了四个标准的隔离级别。默认级别是:REPEATABLE READ(可重复读),通过间隙锁策略防止幻读的出现。(事务处理比较好)
MyISAM存储引擎
MySQL5.1之后默认的搜索引擎,提供了大量特殊性,但不支持事务和行级锁,崩溃后无法安全修复。(请不要默认使用MyISAM,而是InnoDB)。(事务处理不好,如果主要使用slect和insert,这个比较好,但是安全修复性不好)
- 存储
MyISAM将表存储在两个文件中:数据文件和索引文件,分别一.MYD和.MYI位扩展名。
- MyISAM特性
- 加锁与并发:对整张表枷锁,而不是针对行。
- 修复
- 索引特性
- MyISAM 压缩表
- MyISAM性能
MySQL内建的其他存储引擎
- Archive引擎
- Blackhole引擎
- CSV引擎
- Federated引擎
- Memory引擎
- Merge引擎
- NDB集群引擎
第三方存储引擎
- OLTP类引擎
- 面向列的存储引擎
- 社区存储引擎
选择合适的引擎
- 事务:InnoDB是目前最稳定的选择,如果不是事务,并且主要是查找插入,选择MyISM
- 备份:InnoDB基本的要求。
- 崩溃恢复:InnoDB好一些
- 特有特性:MySQL中只有MyISAM支持地理空间搜索。
总结
MySQL拥有分层的架构。上层是服务器层的服务和查询执行引擎,下层是存储引擎。中间有很多不同作用的插件API。InnoDB95%以上都是用户最好的选择。