【聊聊MySQL】一. MySQL存储引擎

一.MySQL介绍

作为 MySQL 系列的开篇,我觉得还是有必要说说大家熟悉的 MySQL 数据库的一些东西。 MySQL 我想作为开发者应该没有人不认识或者不熟悉了吧。不管所在的厂子是大中小,基本上很多时候都会采用 MySQL 作为我们数据的存储介质。当然政府项目很多都会采用 Oracle 数据库,不过最近看来,这个事情貌似也不是绝对。也有很多政府的项目已经决定采用 MySQL 或者其他厂商封装的 MySQL 分支了。 作为数据库,其实定义是这样的:

  • 数据库:文件或者其他文件类型的集合,在 MySQL 中,文件被存储为 frm myd ibd 等多种形式的文件。而有些存储引擎比如 NDB 他的数据信息则是被存储在内存之中的,并不会持久化到硬盘上面,所以他不需要文件来进行存储。速度稍稍快但数据库出现异常重启的话,数据就会丢失。
  • 数据库实例或软件:其实就是运行的,可以读取以上数据库文件的软件进程,他可能是一个也可能是多个,日常开发经常是运行一个的情形。我们运行 SQL 或者其他操作的,其实都是在跟数据库实例进行交互,数据库实例会根据命令,计算出来比较高效的查询策略在硬盘上进行数据查询。

    二.MySQL体系结构

数据库由上面几大部分组成,每一部分基本上所做的事情都非常多,而且对数据操作过程中都起着非常重要的作用。MySQL 还有个特点就是存储引擎采用插件式的方式,只要我们按照 MySQL 规范去开发引擎,即可引入数据库软件然后进行启动存储。引擎不是存储数据的地方,而是定义怎么存储数据的地方。而且存储引擎的细粒度是表,也就是说我们新建一个数据库(database),可以使用多个存储引擎来建表。

三.MySQL存储引擎

由于我们经常使用的无非就是 InnoDBMyISAM 两种引擎,所以其他的我并不打算细讲,稍微带过去就可以了。

1.InnoDB

InnoDB 支持数据库事务(SQL 要么一起成功要么一起失败)现在 MySQL 版本默认的存储引擎,支持行级锁,支持外键,以及支持非锁定读(读取不会产生锁)。 通过多版本并发控制 MVCC 来获得高并发性,并且实现 SQL 标准的 4 种隔离机制,默认隔离机制是 REPEATABLE,同时使用一种 next-key locking 策略(简单说就是版本控制)来避免幻读的产生。 说到这得回忆一下 MySQL 的四种隔离级别:

隔离级别

说明

Serializable

最严格的级别,有事务一个一个来,最慢也最安全

REPEATABLE READ

避免修改另外一个事务读取但未修改的数据,但不能避免幻读

READ COMMITTED

大多数数据库采用的级别,避免脏读但不避免幻读和不可重复读

Read Uncommitted

事务会读取到另外一个事物已修改但未提交的数据

  • 脏读:读取到了其他事务已修改但未提交的数据,如A读取到了B事务修改后的数据X,但是B事务进行了回滚,这时候说明A事务产生了脏读。
  • 不可重复读:事务A读取一条数据,后面B事务修改了这条数据,A再次读取时发现数据不匹配,这就是不可重复读
  • 幻读:事务A根据某个条件读取N条数据,事务B改变了其他数据使之满足A的搜索条件,事务再次读取发现有大于N条的数据

InnoDB 存数数据的时候是按照主键(如果没有设置主键,InnoDB 会偷偷的给一个主键)的顺序进行存储,形成 B+ 树结构,根据其他索引查询的时候需要回表,即回到最原始的这棵树进行匹配再返回所有数据。

2.MyISAM

InnoDB 支持的事务、表锁他都不支持,也不支持全文索引。由 MYDMYI 文件共同协助。前者存储数据后者存储索引。支持全文索引。

3.NDB

集群存储引擎,NDB 是将数据全部放置于内存中(5.1 之后可以将非索引数据放置于硬盘),因此主键查找很快,也可以新增节点提高性能。但是连接操作是在 MySQL 数据库层,并非引擎完成(其实就是说连接的时候不能真正的连接而是需要一个一个查询连接)效率较低。

4.Memory

也是数据存储于内存的引擎,使用哈希索引进行查询。但有些限制:不支持 VARCHAR 使用 CHAR 的形式进行存储,也不支持大文本数据。临时表会使用该引擎进行查询,但是如果临时表有大文本或者超过容量设置,就会降级至 MyISAM 进行存储到硬盘,由于 MyISAM 不支持缓存数据文件,因此此时临时表可能会拖慢查询速度。

5.Archive

只支持 INSERTSELECT 的引擎,对数据进行压缩,压缩比高,适合存储归档数据如日志信息等。其目的是压缩。

6.Federated

不存放数据的引擎,指向一台远程的 MySQL 数据库服务器的表。

7.Maria

MyISAM 的后续版本,支持缓存数据和索引文件,行级锁设计、提供 MVCC 功能,支持事务,以及更好的 BLOB 字符类型的处理性能。 MySQL 支持哪些存储引擎可以通过语句 SHOW ENGINES\G 来查看。

四.连接MySQL

TCP/IP

可以说最常见的连接方式了,使用 IP 用户名 密码 进行连接基本是我们调试,生产一直使用的方式。请求连接时 MySQL 数据库实例会判断当前用户是否拥有权限进行连接,一般来说,会限制用户只能从哪个 IP 进行连接。

命令管道和共享内存

Windows 系列上,如果客户端和服务端同属于一台服务器上,那么可以通过配置文件配置 --enable-named-pipe 选项开启命令管道,当然这些方法都不常用,不细说。

UNIX管道

首先使用 TCP/IP 进行数据库连接,运行 SHOW VARIABLES LIKE 'socket' 命令查看 Socket 管道所在的位置,然后我们就可以通过 mysql -uroot -S /tmp/mysql.sock 从而使用 UNIX管道 的方式进行数据库连接。

五.总结

了解 MySQL 术语; 了解 MySQL 体系架构; 了解 MySQL 支持的引擎系列; 了解 MySQL 的连接方式。