【聊聊MySQL】一. MySQL存储引擎
一.MySQL介绍
作为 MySQL
系列的开篇,我觉得还是有必要说说大家熟悉的 MySQL
数据库的一些东西。 MySQL
我想作为开发者应该没有人不认识或者不熟悉了吧。不管所在的厂子是大中小,基本上很多时候都会采用 MySQL
作为我们数据的存储介质。当然政府项目很多都会采用 Oracle
数据库,不过最近看来,这个事情貌似也不是绝对。也有很多政府的项目已经决定采用 MySQL
或者其他厂商封装的 MySQL
分支了。 作为数据库,其实定义是这样的:
- 数据库:文件或者其他文件类型的集合,在
MySQL
中,文件被存储为frm
myd
ibd
等多种形式的文件。而有些存储引擎比如NDB
他的数据信息则是被存储在内存之中的,并不会持久化到硬盘上面,所以他不需要文件来进行存储。速度稍稍快但数据库出现异常重启的话,数据就会丢失。 - 数据库实例或软件:其实就是运行的,可以读取以上数据库文件的软件进程,他可能是一个也可能是多个,日常开发经常是运行一个的情形。我们运行
SQL
或者其他操作的,其实都是在跟数据库实例进行交互,数据库实例会根据命令,计算出来比较高效的查询策略在硬盘上进行数据查询。二.MySQL体系结构
数据库由上面几大部分组成,每一部分基本上所做的事情都非常多,而且对数据操作过程中都起着非常重要的作用。MySQL
还有个特点就是存储引擎采用插件式的方式,只要我们按照 MySQL
规范去开发引擎,即可引入数据库软件然后进行启动存储。引擎不是存储数据的地方,而是定义怎么存储数据的地方。而且存储引擎的细粒度是表,也就是说我们新建一个数据库(database),可以使用多个存储引擎来建表。
三.MySQL存储引擎
由于我们经常使用的无非就是 InnoDB
和 MyISAM
两种引擎,所以其他的我并不打算细讲,稍微带过去就可以了。
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
支持的事务、表锁他都不支持,也不支持全文索引。由 MYD
和 MYI
文件共同协助。前者存储数据后者存储索引。支持全文索引。
3.NDB
集群存储引擎,NDB
是将数据全部放置于内存中(5.1
之后可以将非索引数据放置于硬盘),因此主键查找很快,也可以新增节点提高性能。但是连接操作是在 MySQL
数据库层,并非引擎完成(其实就是说连接的时候不能真正的连接而是需要一个一个查询连接)效率较低。
4.Memory
也是数据存储于内存的引擎,使用哈希索引进行查询。但有些限制:不支持 VARCHAR
使用 CHAR
的形式进行存储,也不支持大文本数据。临时表会使用该引擎进行查询,但是如果临时表有大文本或者超过容量设置,就会降级至 MyISAM
进行存储到硬盘,由于 MyISAM
不支持缓存数据文件,因此此时临时表可能会拖慢查询速度。
5.Archive
只支持 INSERT
和 SELECT
的引擎,对数据进行压缩,压缩比高,适合存储归档数据如日志信息等。其目的是压缩。
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
的连接方式。