MySQL结构
MySQL.png
MySQL是进程/线程模型
- 进程/线程: 主要是控制客户端连接,做权限校验,最大连接数,查询缓存,插入缓冲等
- 缓存:MySQL自带缓存功能,当两条SQL语句执行相同,第二语句就会走缓存。如果缓存不匹配,就走分析器
-
分析器: 进来的SQL语句,进行分析。找到一条最优路径来执行SQL
+优化器: 当分析器找到执行SQL的最优路径,优化器就会对其优化。达到最高效率 - 存储引擎: 负责将SQL语句要找的数据,从数据文件提取出来。或者将SQL语句要存入的数据,存入数据文件
- 数据文件: 存储数据的
MySQL存储引擎
MySQL存储引擎是以插件方式进行提供
show engines;
可以查看MySQL支持的存储引擎
主流的存储引擎 MyISAM,InnoDB
InnoDB引擎
- 支持表空间
表空间中含有表的数据和索引,一个表有表空间和表的格式两个文件
- 是多个表共用一个表空间
ibdata1,ibdata2 - 可以为每一个表设置单独的表空间
innodb_file_per_table=1
例 user表有 user.ibd,user.frm两个文件构成。ibd文件有表数据和表索引。frm(format),为表的格式
表空间不是固定大小,随着表数据的增加而加大。表空间有点类似于LVS中的 vg,表为lv,底下的存储相当于pv
- 支持事务
- 支持隔离机制MVCC(Multi Version Concurrency Control )多版本并发控制,有四种隔离级别。读为提交,读以提交,可重复读,串行读。四种隔离机制。默认为可重复读即rr
隔离级别越小,并发性能越高,越容易出粗。
可重复读,一般会出现幻读。
幻读:
即一个人读取了2和3两行,但另外一个人,在2和3之间插入了一行。此时读的那个人就会出现3行。此为幻读
为了解决幻读,MySQL加入了间隙锁。即一个人在操作2和3行,这之间的间隙也被锁住。不会被操作
串行读:
当一个人操作2和3行时,另外做相同操作的人,必须等到第一个人操作完毕。才能接着操作,此为串行读 - 支持行级锁,间隙锁
- 如果锁的粒度很小,则可能会出现死锁。
死锁:
用户A需要 B 和 C,已经操作B了需要C 。用户D 需要C 和 B,已经操作C了需要 B。此时A和D操作的线程就是死锁。需要解开,否则无法操作
- 如果锁的粒度很小,则可能会出现死锁。
- 支持热备
MyISAM
- 表级锁
- 支持全文索引,搭配特定的函数使用如空间函数
- 读多写少的场景适合用