Mysql内部运行机制及存储引擎介绍

478 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

Mysql内部运行机制及存储引擎介绍

一条sql的执行过程

sql_excute_process.png

Mysql架构简介:

  • 客户端连接层

​ 顾名思义就是客户端通过mysql连接器,很mysq通信连接;

  • 服务层

​ 这一层涵盖了大多数的功能,包括缓存查询、sql语句解析优化,与引擎层的通信等;

  • 存储引擎

​ 与底层文件交互,负责数据点额存储与查询,最常用的存储引擎有MyISAM和INNODB,

  • 系统文件

​ 主要是存储一些日志文件,数据文件,配置等文件

  1. 建立连接 客户端通过连接器以半双工的方式与服务端建立连接,连接器负责与客户端建立通讯,管理客户端的连接信息; 通过show processlist;命令来查看用户正在运行的线程信息

show_list.png

​ 如果客户端长时间内有Commend操作到服务端,连接器将跟客户端自动断开;

  1. 查询缓存

    ​ 假如数据库开启了缓存机制,客户端建立了连接之后,执行select操作,会首先取mysql的缓存中查询当前查询的select语句是否完全匹配完全匹配,如果是则直接返回,不需要再次查询磁盘,这种情况下效率非常高;

    ​ 一般情况下,缓存功能存在的意义不大,因为对于同一个数据表而言,这张表缓存的数据一旦遇到更新这张表的情况,会把缓存完全清除也就是说前面费劲巴拉缓存的数据,有可能还没使用就被清除了,而且命中缓存的场景比较苛刻,要求查询语句跟缓存语句完全一致,一般在一下全局配置表,常量表等这些一般不做增删改的表中使用,还是可以的;

  2. 解析器

    ​ 当上一步的缓存没能命中sql语句,解析器会把输入的sql进行语法解析,根据mysql的相关语法规则,检查sql是否合乎规范,不符合会有You have an error in your SQL syntax报错提醒;最后生成一个新的解析树;

  3. 优化器

​ 优化器是根据解析数来生成最佳的执行计划,优化器有很多优化策略,在保证执行结果正确的情形下,选择执行效率最高的,

  1. 执行器

​ 执行器负责执行sql语句,根据sql语句表中的存储引擎,调用相对应的api跟存储引擎交互,查询得到结果返回给客户端,如果开启了缓存机制,则也会把相对应的sql和结果一并存储到缓存;

存储引擎

一般最常用的存储引擎:InnoDB、MyISAM、Memory

  • InnoDB:
    1. mysql5.5的默认存储引擎,支持事务操作,适合频繁的增删改操作
    2. Innodb的索引使用聚簇索引,节点缓存索引很数据记录,
    3. 支持行级锁,锁并发力度低,并发性能好;支持外键
    4. Innodb支持并发,使用MVCC控制事务合并发
    5. InnoDB表对应两个文件,.frm表结构文件和.ibd数据文件;
    6. 需要更多的内存和磁盘存储,会在它的主存中建立buffer pool用来缓冲数据和索引;
  • MyISAM:
    1. 5.5之前的默认引擎,不支持事务和外键,适合大量的查询操作
    2. MyISAM使用非聚集索引,索引和记录分开,叶子节点存储的是行数据的地址,因此需要回表操作查询数据;
    3. 不支持事务,表级锁,并发度低;适合select操作
    4. 对应三个文件 .frm表结构文件,MYD表数据文件,.MYI索引文件。

大多数的情况下选择INNODB存储引擎就能满足绝大多数的应用场景,也是默认使用的存储引擎,如果遇到文献类网站,查询频繁写操作不是很多的场景,应当选择MyISAM引擎;