目录
1. Mysql逻辑架构
第一层:
大多数网络客户端都有类似的架构,比如连接处理,授权认证,安全等
第二层:
查询解析,分析优化缓存医技所有的内置函数,所有跨存储引擎的功能都在这一层实现,存储过程,,触发器,试图等
第三层:
包含了存储引擎,负责对数据的存储和提取.
1.1 优化与执行
每个客户端都会在进程中拥有一个线程,这个连接的查询只会在单独的线程中执行. mysql会解析查询,并创建内部数据结构,进行优化.对于select语句,服务器会先查询缓存,如果查询到存在的数据,那么服务器就不在执行,查询解析,优化和执行的过程,而是直接返回查询缓存中的结果集.
1.2 并发控制
在同一时刻,多个客户端同时修改同一资源,会产生并发问题.
读写锁:
读锁又叫共享锁:顾名思义,该锁是共享的,是互不堵塞的.多个客户端可以再同一时刻读取同一个资源,且互不干扰.
写锁:又叫排它锁,也就是说,当资源被加写锁,其他的进程无法读和写的.会阻塞其他的读锁和写锁.只有在排它锁释放,其他进程才能获取锁并进行操作.
锁粒度:
将锁粒度定位在一个好的级别,可以为某些特定的业务场景提供能好的性能.
表锁:锁定某个表,是mysql中最基本的锁,并且是开销最小的策略
行锁:粒度最小,开销最大.
全局锁:对数据库实例进行加锁.
1.3事务:
就是一组原子性的sql查询,要么全部执行成功,要么全部执行失败.
原子性:一个事务必须视为一个不可分割的最小工作单位,要么全执行成功,要么全执行失败.
一致性:总是从一个一致的状态转换到另一个一致的状态.
隔离性:一个事务在修改提交之前,对其他的事务不可见
持久性:事务一旦提交,保存到数据库的数据会永久保存.
隔离级别:
未提交读:又称脏读,事务中的数据修改,即使没有提交,其他事务可以读到未提交的数据.
提交读:又称不可重复度,一个事务从开始到提交之前,是对其他事务是不可见的,在执行两次相同的查询,读出来的结果呢能不一致.
可重复度:幻读,指的是一个事务在读取某个范围内的记录时,另一个事务又向该范围插入了新的记录,当之前的事务再次读取可能会出现幻行.\是mysql的默认事务隔离级别.
可串行化:对每一行都加锁...
死锁:
指的是两个或多个客户端,在同一资源上占用,并请求锁定对方占用的资源,导致了恶性循环的现象.成为死锁.
事务的传播机制:
- requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
- supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
- required_new:新建事务,如果当前存在事务,把当前事务挂起。
- mandatory:使用当前事务,如果没有当前事务,就抛出异常。
- not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- never:以非事务方式执行操作,如果当前事务存在则抛出异常。
- nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作
1.4 多版本并发控制(MVCC)
mvcc的实现是数据库通过保存数据在某个时间点的快照实现的,也就是说,不管执行多长时间,每个事务看到的数据都是一致的.使用过保存了两个隐藏列来实现的.事务开始的版本号,会用来和查询到的数据版本号进行比较.
1.5 Mysql存储引擎
5.1版本之前,默认的存储引擎是MyISAM,之后是InnoDB
MyISAM | IndoDB | |
存储 | 数据文件与索引文件是分开的 .MDY .MDI 可以包含动态或静态行,可以存储行记录 | 数据文件与索引文件是一起的 .ibd,不存储行记录 |
锁与并发 | 仅支持表锁 | 表锁,行锁,默认行锁 |
修复 | 手动或自动执行检查和修复操作 | |
索引 | 即使是blob text等长字段,可以对其前500个字符创建索引 支持全文索引 | 支持全文索引 |
压缩表 | 支持压缩表 | |
性能 | 引擎设计简单,数据以紧密格式存储 | |
事务 | 不支持 | 支持 |
备份 | 支持在线热备份 | |
恢复 | 数据损坏概率大,恢复速度慢 | 数据损坏概率大,恢复速度快 |
外键 | 不支持 | 支持 |
MVCC | 不支持 | 支持 |
《MySQL高性能》上面有一句话这样写到: 不要轻易相信“MyISAM比InnoDB快”之类的经验之谈,这个结论往往不是绝对的。在很多我们已 知场景中,InnoDB的速度都可以让MyISAM望尘莫及,尤其是用到了聚簇索引,或者需要访问的 数据都可以放入内存的应用。