持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
Mysql内部运行机制及存储引擎介绍
一条sql的执行过程
Mysql架构简介:
- 客户端连接层
顾名思义就是客户端通过mysql连接器,很mysq通信连接;
- 服务层
这一层涵盖了大多数的功能,包括缓存查询、sql语句解析优化,与引擎层的通信等;
- 存储引擎
与底层文件交互,负责数据点额存储与查询,最常用的存储引擎有MyISAM和INNODB,
- 系统文件
主要是存储一些日志文件,数据文件,配置等文件
- 建立连接 客户端通过连接器以半双工的方式与服务端建立连接,连接器负责与客户端建立通讯,管理客户端的连接信息; 通过show processlist;命令来查看用户正在运行的线程信息
如果客户端长时间内有Commend操作到服务端,连接器将跟客户端自动断开;
-
查询缓存
假如数据库开启了缓存机制,客户端建立了连接之后,执行select操作,会首先取mysql的缓存中查询当前查询的select语句是否完全匹配完全匹配,如果是则直接返回,不需要再次查询磁盘,这种情况下效率非常高;
一般情况下,缓存功能存在的意义不大,因为对于同一个数据表而言,这张表缓存的数据一旦遇到更新这张表的情况,会把缓存完全清除也就是说前面费劲巴拉缓存的数据,有可能还没使用就被清除了,而且命中缓存的场景比较苛刻,要求查询语句跟缓存语句完全一致,一般在一下全局配置表,常量表等这些一般不做增删改的表中使用,还是可以的;
-
解析器
当上一步的缓存没能命中sql语句,解析器会把输入的sql进行语法解析,根据mysql的相关语法规则,检查sql是否合乎规范,不符合会有You have an error in your SQL syntax报错提醒;最后生成一个新的解析树;
-
优化器
优化器是根据解析数来生成最佳的执行计划,优化器有很多优化策略,在保证执行结果正确的情形下,选择执行效率最高的,
- 执行器
执行器负责执行sql语句,根据sql语句表中的存储引擎,调用相对应的api跟存储引擎交互,查询得到结果返回给客户端,如果开启了缓存机制,则也会把相对应的sql和结果一并存储到缓存;
存储引擎
一般最常用的存储引擎:InnoDB、MyISAM、Memory
- InnoDB:
- mysql5.5的默认存储引擎,支持事务操作,适合频繁的增删改操作
- Innodb的索引使用聚簇索引,节点缓存索引很数据记录,
- 支持行级锁,锁并发力度低,并发性能好;支持外键
- Innodb支持并发,使用MVCC控制事务合并发
- InnoDB表对应两个文件,.frm表结构文件和.ibd数据文件;
- 需要更多的内存和磁盘存储,会在它的主存中建立buffer pool用来缓冲数据和索引;
- MyISAM:
- 5.5之前的默认引擎,不支持事务和外键,适合大量的查询操作
- MyISAM使用非聚集索引,索引和记录分开,叶子节点存储的是行数据的地址,因此需要回表操作查询数据;
- 不支持事务,表级锁,并发度低;适合select操作
- 对应三个文件 .frm表结构文件,MYD表数据文件,.MYI索引文件。
大多数的情况下选择INNODB存储引擎就能满足绝大多数的应用场景,也是默认使用的存储引擎,如果遇到文献类网站,查询频繁写操作不是很多的场景,应当选择MyISAM引擎;