0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MySQL的整体逻辑架构

马哥Linux运维 来源:cnblogs 2024-04-30 11:14 次阅读

支持多种存储引擎是众所周知的MySQL特性,也是MySQL架构的关键优势之一。如果能够理解MySQL Server与存储引擎之间是怎样通过API交互的,将大大有利于理解MySQL的核心基础架构。本文将首先介绍MySQL的整体逻辑架构,然后分析MySQL的存储引擎API并介绍如何编写自己的MySQL存储引擎。

MySQL逻辑架构

MySQL作为一个大型的网络程序、数据管理系统,架构非常复杂。下图大致画出了其逻辑架构。

86333662-061b-11ef-a297-92fbcf53809c.png

Connectors

MySQL首先是一个网络程序,其在TCP之上定义了自己的应用层协议。所以要使用MySQL,我们可以编写代码,跟MySQL Server建立TCP连接,之后按照其定义好的协议进行交互。当然这样比较麻烦,比较方便的办法是调用SDK,比如Native C API、JDBC、PHP等各语言MySQL Connector,或者通过ODBC。但通过SDK来访问MySQL,本质上还是在TCP连接上通过MySQL协议跟MySQL进行交互。

Connection Management

每一个基于TCP的网络服务都需要管理客户端链接,MySQL也不例外。MySQL会为每一个连接绑定一个线程,之后这个连接上的所有查询都在这个线程中执行。为了避免频繁创建和销毁线程带来开销,MySQL通常会缓存线程或者使用线程池,从而避免频繁的创建和销毁线程。

客户端连接到MySQL后,在使用MySQL的功能之前,需要进行认证,认证基于用户名、主机名、密码。如果用了SSL或者TLS的方式进行连接,还会进行证书认证。

SQL Interface

MySQL支持DML(数据操作语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定义函数等多种SQL语言接口

Parser

MySQL会解析SQL查询,并为其创建语法树,并根据数据字典丰富查询语法树,会验证该客户端是否具有执行该查询的权限。创建好语法树后,MySQL还会对SQl查询进行语法上的优化,进行查询重写。

Optimizer

语法解析和查询重写之后,MySQL会根据语法树和数据的统计信息对SQL进行优化,包括决定表的读取顺序、选择合适的索引等,最终生成SQL的具体执行步骤。这些具体的执行步骤里真正的数据操作都是通过预先定义好的存储引擎API来进行的,与具体的存储引擎实现无关。

Caches & Buffers

MySQL内部维持着一些Cache和Buffer,比如Query Cache用来缓存一条Select语句的执行结果,如果能够在其中找到对应的查询结果,那么就不必再进行查询解析、优化和执行的整个过程了。

Pluggable Storage Engine

存储引擎的具体实现,这些存储引擎都实现了MySQl定义好的存储引擎API的部分或者全部。MySQL可以动态安装或移除存储引擎,可以有多种存储引擎同时存在,可以为每个Table设置不同的存储引擎。存储引擎负责在文件系统之上,管理表的数据、索引的实际内容,同时也会管理运行时的Cache、Buffer、事务、Log等数据和功能。

MySQL 5.7.11默认支持的存储引擎如下:

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

File System

所有的数据,数据库、表的定义,表的每一行的内容,索引,都是存在文件系统上,以文件的方式存在的。当然有些存储引擎比如InnoDB,也支持不使用文件系统直接管理裸设备,但现代文件系统的实现使得这样做没有必要了。

在文件系统之下,可以使用本地磁盘,可以使用DAS、NAS、SAN等各种存储系统。

存储引擎API

MySQL定义了一系列存储引擎API,以支持插件式存储引擎架构。API以Handler类的虚函数的方式存在,可在代码库下的./sql/handler.h中查看详细信息,可在handler类的注释中看到描述:

/**
  The handler class is the interface for dynamically loadable
  storage engines. Do not add ifdefs and take care when adding or
  changing virtual functions to avoid vtable confusion

  Functions in this class accept and return table columns data. Two data
  representation formats are used:
  1. TableRecordFormat - Used to pass [partial] table records to/from
     storage engine

  2. KeyTupleFormat - used to pass index search tuples (aka "keys") to
     storage engine. See opt_range.cc for description of this format.

  TableRecordFormat
  =================
  [Warning: this description is work in progress and may be incomplete]
  The table record is stored in a fixed-size buffer:

    record: null_bytes, column1_data, column2_data, ...

  //篇幅原因,略去部分内容。

*/
class handler :public Sql_alloc
{
    //篇幅原因,不列出具体代码。读者可直接在源码文件./sql/handler.h中找到具体内容。
}

下面我将分类描述部分存储引擎API。

创建、打开和关闭表

通过函数create来创建一个table:

/**
  *name:要创建的表的名字
  *from:一个TABLE类型的结构,要创建的表的定义,跟MySQL Server已经创建好的tablename.frm文件内容是匹配的
  *info:一个HA_CREATE_INFO类型的结构,包含了客户端输入的CREATE TABLE语句的信息
*/

int create(const char *name, TABLE *form, HA_CREATE_INFO *info);

通过函数open来打开一个table:

/**
  mode包含以下两种
  O_RDONLY  -  Open read only
  O_RDWR    -  Open read/write
*/
int open(const char *name, int mode, int test_if_locked);

通过函数close来关闭一个table:

int close(void);

对表加锁

当客户端调用LOCK TABLE时,通过external_lock函数加锁:

int ha_example::external_lock(THD *thd, int lock_type)

全表扫描

//初始化全表扫描
virtual int rnd_init (bool scan);

//从表中读取下一行
virtual int rnd_next (byte* buf);

通过索引访问table内容

//使用索引前调用该方法
int ha_foo::index_init(uint keynr, bool sorted) 


//使用索引后调用该方法
int ha_foo::index_end(uint keynr, bool sorted)

//读取索引第一条内容
int ha_index_first(uchar * buf);

//读取索引下一条内容
int ha_index_next(uchar * buf);

//读取索引前一条内容
int ha_index_prev(uchar * buf);

//读取索引最后一条内容
int ha_index_last(uchar * buf);

//给定一个key基于索引读取内容
int index_read(uchar * buf, const uchar * key, uint key_len,
                         enum ha_rkey_function find_flag)

事务处理

//开始一个事务
int my_handler::start_stmt(THD *thd, thr_lock_type lock_type)

//回滚一个事务
int (*rollback)(THD *thd, bool all); 

//提交一个事务
int (*commit)(THD *thd, bool all);

如何编写自己的存储引擎

在MySQL的官方文档上,有对于编写自己的存储引擎的指导文档,链接如下。

作为编写自己存储引擎的开始,你可以查看MySQL源码库中的一个EXAMPLE存储引擎,它实现了必须要实现的存储引擎API,可以通过复制它们作为编写我们自己存储引擎的开始:

sed -e s/EXAMPLE/FOO/g -e s/example/foo/g ha_example.h > ha_foo.h
sed -e s/EXAMPLE/FOO/g -e s/example/foo/g ha_example.cc > ha_foo.cc

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1348

    浏览量

    78978
  • MySQL
    +关注

    关注

    1

    文章

    801

    浏览量

    26433

原文标题:MySQL的多存储引擎架构

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    整体架构

    整体思路整体思路整体思路
    发表于 06-27 15:10

    0基础学Mysql:mysql入门视频教程!

    的性能调优技术掌握基于MySQL架构设计方案课程目录:第1节 MySQL课程介绍和MySQL的基础概念(1)第2节 MySQL基础概念之存
    发表于 07-08 10:51

    FPGA芯片整体架构

    FPGA芯片整体架构如下所示,整个芯片是以BANK进...
    发表于 07-29 07:00

    初探Android系统整体架构

    Android系统庞大且错综复杂,今天小编将带领大家初探Android系统整体架构,一窥其全貌。引言本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体
    发表于 08-20 06:32

    XILINX FPGA 芯片整体架构是如何构成的

    XILINX FPGA 芯片整体架构是如何构成的?XILINX FPGA 芯片有哪些资源?
    发表于 10-29 06:26

    匿名飞控源码整体逻辑顺序是怎样的

    匿名飞控源码整体逻辑顺序是怎样的?
    发表于 01-20 07:50

    RRC逻辑架构(UE侧)

    RRC逻辑架构(UE侧)
    发表于 09-18 15:24 1102次阅读

    RRC逻辑架构(UTRAN侧)

    RRC逻辑架构(UTRAN侧)
    发表于 09-18 15:25 943次阅读

    MySQL基础架构自动化测试分析

    schema 迁移等几个方面说明了为何会相信MySQL自动化。以下为译文。 对于GitHub来说,MySQL的基础架构是非常重要的组件。MySQL给GitHub.com、GitHub
    发表于 09-28 16:47 0次下载
    <b class='flag-5'>MySQL</b>基础<b class='flag-5'>架构</b>自动化测试分析

    详解MySQL的查询优化 MySQL逻辑架构分析

    说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后
    的头像 发表于 05-28 16:43 4311次阅读
    详解<b class='flag-5'>MySQL</b>的查询优化 <b class='flag-5'>MySQL</b><b class='flag-5'>逻辑</b><b class='flag-5'>架构</b>分析

    MySQL数据库:理解MySQL的性能优化、优化查询

    最近一直在为大家更新MySQL相关学习内容,可能有朋友不懂MySQL的重要性。在程序,语言,架构更新换代频繁的今天,MySQL 恐怕是大家使用最多的存储数据库了。由于
    的头像 发表于 07-02 17:18 3067次阅读
    <b class='flag-5'>MySQL</b>数据库:理解<b class='flag-5'>MySQL</b>的性能优化、优化查询

    干货:20个MySQL开源数据库架构设计原则

    干货:20个MySQL开源数据库架构设计原则
    的头像 发表于 08-28 10:57 3355次阅读

    MySQL的底层原理和技术学习

    面试时,被面试官吊打的现象成了家常便饭。 不仅仅是面试,如果你想从一名底层程序员上升为高级工程师、架构师等,MySQL的底层原理和技术是你必须要掌握的。 今天一起来学习MySQL的体系架构
    的头像 发表于 04-06 16:51 3032次阅读

    SQLite和MySQL区别

    Web应用、电商平台等。 2.架构差异 MySQL采用C/S架构,是典型的客户端/服务器模式。MySQL服务器是一
    的头像 发表于 08-28 17:09 4666次阅读

    适用于MySQL的dbForge架构比较

    dbForge Schema Compare for MySQL 是一种工具,用于轻松有效地比较和部署 MySQL 数据库结构和脚本文件夹差异。该工具提供了 MySQL 数据库架构中所
    的头像 发表于 10-28 09:41 140次阅读
    适用于<b class='flag-5'>MySQL</b>的dbForge<b class='flag-5'>架构</b>比较