MySQL技术内幕学习有感(二)——体系结构与存储引擎

一、前言

在工作中,用到最为广泛的数据库,莫过于MySQL,除了开源特性之外,其上佳的可移植性、插件式的存储引擎也是其受欢迎的重要原因之一,本系列就直接按照《技术内幕》章节记录个人的一些学习心得和总结。

二、MySQL特性概述

MySQL被设计成一个可移植的数据库,所以当前几乎所有的操作系统均可以支持MySQL,虽然各个平台底层实现上有所差异,但是MySQL基本上可以保证在各个平台上的物理结构一致性,从而屏蔽了系统实现上的差异。因此,用户应该可以很好理解MySQL在平台上的运作原理。

三、重要概念

1、数据库(database):物理操作系统文件或者其他形式文件类型的集合。数据库的本质是文件,或者说二进制文件。

2、实例(instance):MySQL数据库由后台线程以及一个共享内存区组成。共享内存可以被运行的后台线程共享。数据库实例才是真正用于操作数据库文件的。

PS:数据库和实例是一一对应的,即一个实例对应一个数据库,一个数据库对应一个实例。但如果是集群情况下,可能存在一个数据库被多个实例使用的情况。(比如常见的主备库结构)

这里再补充一点,方便更好区分两者关系:
数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合;

而数据库实例是程序,位于用户与操作系统之间的一层数据管理软件,用户对数据库数据的任何操作,都是依赖于数据库实例进行的,应用程序只有通过数据库实例才能和数据库打交道。

四、MySQL体系结构

在厘清了数据库和实例之后,还需要来看一下MySQL的体系结构,
MySQL体系结构
从上图可以知道,MySQL由以下几部分组成:

  • 连接池组件
  • 管理服务和工具组件
  • SQL接口组件
  • 查询分析器组件
  • 优化器组件
  • 缓冲组件
  • 插件式存储引擎
  • 物理文件

而图中最上层的Connectors就是我们常见的连接数据库实例的工具,这些工具依赖于具体的语言有各自的实现规则,比如Java中的JDBC。

另外MySQL还有一个很重要的就是其独有的插件式体系结构,由于MySQL有多个不同的存储引擎(常见如InnoDB、MyISAM),且每个存储引擎有各自特点,所以在实际生产过程中,能够针对不同应用的特点选取不同的存储引擎。

1、InnoDB存储引擎

InnoDB存储引擎支持事务,主要面向在线事务处理(OLTP)的应用,主要特点就是行锁设计、支持外键,默认读取操作不会产生锁。

InnoDB存储引擎将数据放在一个逻辑的表空间中,这个表空间就像一个黑河一样,全部由InnoDB存储引擎自行管理。

InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标志的四种隔离级别,默认为REPEATABLE级别(可重复读)。同时使用一种名为next-key locking的策略避免幻读。除此之外,InnoDB存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希所以(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。

对于表中数据的存储,InnoDB存储引擎采用了聚集的方式(clustered)的方式,因此每张表的存储都是按照主键的顺序存放,如果没有显示地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。

说了这么多,简单概括一下,无脑吹呗,不过认真看下来,InnoDB确实对得起别人这么无脑吹。

2、MyISAM存储引擎

说完InnoDB,再说说MyISAM,这个存储引擎不支持事务,采用表锁设计,支持全文索引,主要面向一些OLAP(联机分析处理)数据库应用。

至于为什么MyISAM不支持事务,主要还是因为开发者考虑到,并非所有的应用都需要事务,比如数据仓库中,如果没有ETL(Extract-Transform-Load,抽取-转换-加载)这些操作,只是简单的报表查询,这样的场景下,事务反而显得多余。

当然,MySQL还支持一些其他的存储引擎比如NDB、Memory、Archive、Federated、Maria等等存储引擎,因为篇幅限制,加上日常工作中用到的不多,有兴趣的可以自行了解,此处不做过多赘述

不同MySQL存储引擎相关特性比较

五、连接MySQL

连接MySQL操作,本质是一个连接进程和MySQL数据库实例进行通信,从程序的设计角度上来说,本质上是进程通信。常见的进程通信包括管道、命名管道、命名字、TCP/IP套接字、UNIX域套接字。而TCP/IP套接字是最常见的通信方式。

TCP/IP套接字是MySQL数据库在任何平台下都提供的连接方式,也是网络中使用最多的一种方式。它是在TCP/IP连接上建立一个基于网络的链接请求,一般情况下客户端在一台服务器上,而MySQL实例在另一台服务器上,两台机器通过一个TCP/IP网络连接。

需要注意的是,通过TCP/IP连接到MySQL实例时,MySQL数据库会先检查一张权限视图,用于判断发起请求的客户端IP是否允许连接到MySQL实例。

六、小结

这次的学习,重点是要厘清数据库和实例的关系以及区别,初步了解MySQL的存储引擎特性,以及不同存储引擎的区别,还介绍了连接MySQL的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值