文章目录
- 前言:
- 1、定义数据库和实例
- 2、MySQL体系结构
- 3、MySQL存储引擎
- InnoDB
- MyISAM
- 4、连接MySQL
前言:
该技术文章是我阅读《MySQL技术内幕 InnoDB存储引擎》第2版的总结梳理
我写这里文章的目的:书中的内容过于系统和繁琐,并不是所有的内容都是重点,而且有些描述过于官方
所以该文章不会长篇大论搬运书籍中的内容,我会对书中的重点进行总结、提炼、精简;
不重要的内容不会体现在文章中,通过更加容易理解的方式,阐述给大家,希望能为屏幕前的你带来帮助
1、定义数据库和实例
先搞懂两个概念,数据库和实例:
- 数据库:操作系统文件或其他形式文件的集合
- 实例:由后台线程 + 共享内存组成,
用于操作数据库文件
MySQL是一个单进程,多线程
的持久存储数据库。MySQL实例
在操作系统上的表现就是一个进程
!
MySQL启动时,会读取配置文件,根据配置文件参数进行启动实例,如果找不到参数文件不会启动失败(Oracle会失败),会按照编译时默认的参数进行启动,启动时查找的配置文件顺序如下:
- /etc/my.cnf
- /etc/mysql/my.cnf
- /usr/local/mysql/etc/my.cnf
- ~/.my.cnf
本质来说,就是寻找my.cnf
配置文件,可以理解为这就是MySQL的配置文件!如果这几个配置文件都有同一个参数,就会按照最后那个配置文件参数为准!
我们操作数据库是通过数据库实例
来进行操作的,这句话一定要理解!
2、MySQL体系结构
首先列出MySQL的体系结构图(架构图),自上而下:
从上图可以看出,MySQL采用可拔插的存储引擎
,开发者可以根据自己的需要开发属于自己的存储引擎。存储引擎是基于表,而不是数据库
,MySQL数据库的核心就是存储引擎,这句话要牢记!
冷知识:InnoDB存储引擎其实就是第三方存储引擎,不是官方的;后来被收购了!
3、MySQL存储引擎
InnoDB
MySQL 5.5.8版本开始,InnoDB就是默认存储引擎,主要包含以下特点:
- 支持事务
- 行锁
- 外键
- 非锁定读:默认读取操作不会产生锁
InnoDB将数据放到一个逻辑的表空间中,它将每个表单独存放到独立ibd
文件中;通过MVCC(多版本并发控制)
来获得高并发性;实现了4种事物的隔离级别(默认REPEATABLE
);使用next-key locking
策略避免幻读问题;还提供了许多高性能高可用的功能,例如:
- 插入缓冲 insert buffer
- 二次写 double write
- 自适应哈希 adaptive hash
- 预读 read ahead
- …
InnoDB的表都是按照主键顺序存储的,如果没有主键,InnoDB就会为每一行数据自动生成一个ROWID(6字节)
作为主键
MyISAM
MySQL 5.5.8之前版本,MyISAM是默认存储引擎,主要包含以下特点:
- 不支持事务
- 表锁
- 支持全文索引
- …
与众不同的点:它的缓冲池只缓冲索引文件,不缓存数据文件
MyISAM存储引擎表由MYD
和MYI
组成:
- MYD:用于存储数据文件
- MYI:用于存储索引文件
通过myisampack
工具可以压缩数据文件(该工具采用Huffman算法压缩),所以压缩后的表是只读
;MySQL 5.0之前默认能支持表大小为4GB
,后来版本默认支持256TB
单表数据
关于其他还有很多种储存引擎,不过不是重点,不详细说啦!
4、连接MySQL
连接MySQL是连接进程和MySQL数据库实例进行通信,本质上是进程通信。
目前连接MySQL主要有三种方式:
- TCP/IP连接:例如我们在Windows本地使用Navicat连接云服务器上的MySQL实例。发起连接时,MySQL实例会先检查一张权限视图,用于判断发起请求的客户端IP是否允许连接
- 命名管道和共享内存
- UNIX域套接字:Linux和UNIX环境下可以使用,并且客户端和服务器实例在一台服务器上;实例启动后找到UNIX域套接字路径就可以建立连接了