一、mysql架构
一、简介
mysql是一个开源的数据库管理系统,它相对于oracle更加地轻量、成本低,随着功能的日益完善,它变得备受企业喜爱,尤其是中小企业。
mysql的整体架构大体包括以下几个方面:
1)主体结构
2)物理文件组成
3)sql逻辑模块组成
4)sql逻辑模块协调工作
二、主体结构
mysql服务器主要有两个部分组成:
1)sql层
2)存储引擎层
如图:

从上图我们可以了解到:
1)mysql是一个C/S架构模型,客户端通过与服务端建立连接来操作服务端数据;
2)服务端的连接模块,将每一个客户端发送来的请求作为一个线程处理;
3)分析器分析请求,并转发给优化器;
4)通过缓存的方式提高查询性能;
5)优化器负责和底层的存储引擎进行交互,存储和查询mysql的数据;
三、物理文件组成
mysql的物理文件包括三块:
1)日志文件
1-1)Error log 错误日志:记录遇到的所有严重的错误信息、每次启动关闭的详细信息;
1-2)Binary log 二进制日志:也就是binlog,记录所有修改数据库的操作;
1-3)Query log 查询日志:记录所有查询操作,体积较大,开启后对性能有影响;
1-4)Slow Query log 慢查询日志:记录所有执行时间超过long_query_time的sql语句和达到min_examined_row_limit条距离的语句;
1-5)InnoDB redo log:记录InnoDB所做的物理变更和事务信息;
2)数据文件
2-1).frm文件:表结构定义信息
2-2).MYD文件:MyISAM引擎的数据文件;
2-3).MYI文件:MyISAM引擎的索引文件;
2-4).ibd文件和.ibdata文件:InnoDB的数据和索引;.ibdata配置为共享表空间时使用,.ibd配置为独享表空间时使用;
3)其它文件
3-1)系统配置文件:/etc/my.cnf
3-2) pid文件:存储自己的进程ID
3-3)socket文件:连接客户端使用
四、sql逻辑模块组成
mysql逻辑架构采用sql层和存储引擎分离的方式,实现了数据存储和逻辑业务的分离。宏观上可以分为三层:
1)连接处理层
2)分析、缓存处理层
3)优化器层
事实上sql层又可以细化为很多的子模块:
1)初始化模块:数据库启动时,对数据库的初始化操作;
2)核心API模块:底层操作的优化功能;
3)网络交互模块:对外提供可接收发送数据的API接口;
4)服务器客户端交互协议模块:实现客户端服务端的交互协议;
5)用户模块:控制用户连接登录和授权;
6)访问控制模块:监控用户的每一个操作,依赖于用户模块;
7)连接管理、连接线程和线程管理模块:监听和管理与客户端连接的线程;
8)转发模块:将请求转发到对应的处理模块;
9)缓存模块:将查询请求的结果缓存,提高性能;
10)优化器模块:根据查询请求计算提高查询访问速度的优化策略,根据最优策略返回查询语句;
11)表变更模块:DML和DDL的语句处理;
12)表维护模块:检测表状态、分析、优化表结构、修复表;
13)系统状态管理模块:将各种状态数据返回,如:show status;
14)表管理器:维护系统生成的表文件如:.frm文件.ibd文件...将表结构的信息缓存,另外该模块还管表级别的锁;
15)日志记录模块:负责整个数据库逻辑层的日志文件;
16)复制模块:分为Master模块和Slave模块;Master模块负责复制binary文件,并与Slave端I/O线程交互;Slave模块主要负责从Master端接收binary日志,并写入本地I/O线程,以及从relay log文件中读取日志,解析成Slave端执行的命令,交给Slave端的SQL线程处理;
17)存储引擎接口模块:实现了底层存储引擎插件式管理,将数据处理高度抽象化;
五、sql逻辑模块协调工作
如图:

1)mysql启动以后,初始化模块就从系统配置文件中读取系统参数和命令参数,初始化整个系统,同时存储引擎也会启动;
2)初始化结束后,连接管理模块会监听客户端的连接请求,并将连接请求转发给线程管理模块去请求一个连接线程;
3)线程模块接到请求后会调用用户模块进行授权检查,通过授权以后会检查是否又空闲线程,如果有取出并与客户端连接,如果没有则新建立建立一个线程与客户端连接;
4)mysql请求分为两种,一种是需要命令解析和分发才能执行,另一种可以直接执行;不管哪种,如果开启了日志,那么日志模块会记录日志;
5)如果是Query类型的请求,会将控制权交给Query解析器,Query解析器检查是否Select类型,如果是则启动查询缓存模块,如果缓存命中则将缓存数据返回给连接线程模块,连接线程将数据传递到客户端;如果没有缓存或者不是一个可以缓存的查询,此时解析器会进行相应的处理,通过查询分发器给相关的处理模块;
6)如果解析器结果是DML/DDL,则交给变更模块;如果是检查、修复的查询交给表维护模块,如果是一条没有被缓存的语句,则交给查询优化器模块。实际上表变更模块又分为若干小模块,例如:insert处理器、delete处理器、update处理器、create处理器,以及alter处理器这些小模块来负责不同的DML和DDL。总之,查询优化器、表变更模块、表维护模块、复制模块、状态模块都是根据命令解析器的结果不同而分发给不同的类型模块,最后和存储引擎进行交互。
7)当一条命令执行完毕后,控制权都会还给连接线程模块,在上面各个模块处理过程中都依赖于核心API模块,比如:内存管理、文件I/O,字符串处理等。
参考:《mysql技术内幕》
一、mysql架构的更多相关文章
- 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序
前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来 ...
- ch2 MySQL 架构组成
第 2 章 MySQL 架构组成 前言 麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从 MySQL 物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL ...
- mysql笔记01 MySQL架构与历史、Schema与数据类型优化
MySQL架构与历史 1. MySQL架构推荐参考:http://www.cnblogs.com/baochuan/archive/2012/03/15/2397536.html 2. MySQL会解 ...
- 理解MySQL——架构与概念
写在前面:最早接触的MySQL是在三年前,那时候MySQL还是4.x版本,很多功能都不支持,比如,存储过程,视图,触发器,更别说分布式事务等复杂特性了.但从5.0(2005年10月)开始,MySQL渐 ...
- MySQL 架构
原文:MySQL 架构 MySQL架构和结构分析 官方架构图: MySQL DB 各模块架构图如下: MySQL安装方式 MySQL初始化 简介:什么是事务: 事务: ACID : 事务确保了银行不 ...
- MySQL架构优化:定时计划任务与表分区
转自: MySQL架构优化实战系列3:定时计划任务与表分区 - 今日头条(TouTiao.com)http://toutiao.com/a6304736482361049345/?tt_from=mo ...
- MySQL架构由小变大的演变过程
假设一个网站(discuz)从最开始访问量很小做到日pv千万,我们来推测一下它的mysql服务器架构演变过程. 第一阶段网站访问量日pv量级在1w以下.单台机器跑web和db,不需要做架构层调优(比如 ...
- 第 2 章 MySQL 架构组成
麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成,希望能够让读者对 MySQL 有一个更 ...
- mysql 架构篇系列 3 复制运行状态监控与选项参数说明
一. 概述 在上一篇中,搭建了一主一从的复制架构,这篇通过一些诊断方法来了解复制的运行状态和一些选项参数说明.上次mysql主从服务关机,今天在打开mysql服务,出现了错误信息. 1.首先 启动主从 ...
- MySQL架构总览->查询执行流程->SQL解析顺序
Reference: https://www.cnblogs.com/annsshadow/p/5037667.html 前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后 ...
随机推荐
- composer手动安装到windows
1.配置系统变量 Path 计算机->高级系统设置->环境变量->找到系统变量Path 双击 加入 ;php根目录地址:php中ext地址 如 :“;D:\phpStudy ...
- MySQL直接导出CSV文件,并解决中文乱码的问题
需求: 需要导出hr_users 表中的部分字段的数据,以前是用PHP写脚本,然后导出CSV文件. 在MySQL中,它自己就能导出CSV文件 ,只不过是有如下几个问题需要大家解决. 1. 生成文件不成 ...
- jmeter压力测试值之配置JDBC Connection Configuration(一)
一.下载mysql jar包 下载mysql jar包 http://dev.mysql.com/downloads/connector/j/ 网盘下载地址:mysql-connector-java- ...
- 量化分析获取数据的3种姿势(压箱底的神器Tushare)
自打入门量化分析起,就有相当部分的时间在与数据打交道,从数据的获取.清洗到使用,对分析而言既是繁琐的,也是必须的.有大牛曾经说,量化分析有8成的开发时间都在处理数据. 为了节省时间,将更多精力投入到策 ...
- php引擎文件php.ini优化参数
无论是Apache环境还是nginx环境,php.ini都适合,php-fpm.conf适合nginx+fcgi的配置. 生产环境php.ini(php.ini-production) php.ini ...
- Java Web基础——Controller+Service +Dao三层的功能划分
转自:https://www.cnblogs.com/cielosun/articles/5752272.html 1. Controller/Service/DAO简介: Controller是管理 ...
- 如何统计Visual Studio Code项目的代码行数
背景 年底到了,公司一年一度做述职报告的时间又到了,每到此时小伙伴们都想方设法的去做一些代码层面的汇总.在此交给大家个小妙招,走过路过不要错过哈,, 解决方案 使用Visual Studio Code ...
- layui 时间插件laydate ,取消回调
背景:转型新公司不再是做前端展示H5之类的东西,主要业务是后台数据读取和插件搭建前端页面,接触的第一个老项目是layui制作的,由于业务需求,需要用到时间插件以下为时间插件的一些用法--------- ...
- 浏览器在初始化JS 环境时都发生了些什么
原文:https://segmentfault.com/a/1190000005754797 1.用 C/C++ 构造内部数据结构创建一个 OP 即(Object.prototype)以及初始化其内部 ...
- 获取app应用的包名
1.获取哪个app包名,就打开哪个app 2.在dos窗口下输入: adb shell "dumpsys window | grep mCurrentFocus" 获取包名