数据库和数据库实例
数据库:数据库是文件的集合,是依照某种数据模型组织起来并且存放在二级容器里的数据集合。
数据库实例:数据库则是程序,是位于操作系统以及应用软件之间的一层数据管理程序,我们对数据的任何操作(数据库定义、数据查询、数据维护等等)都是通过数据库实例进行的
通俗的说,数据库就是由一个个文件组成的,这些文件一般是二进制的,而如果我们要对这些文件进行CRUD等操作,我们不能通过简单对数据库文件进行操作而是要通过数据库实例完成对数据库文件的操作
Mysql的体系结构
由图中可以看出,Mysql由以下部分组成
- 连接池组件
- 管理服务和工具组件
- SQL接口组件
- 查询分析器组件
- 优化器组件
- 缓冲组件
- 插件式存储引擎
- 物理文件
Mysql存储引擎
由上图可以看出Mysql支持插件式存储引擎,这也是Mysql独有的插件式体系接口。
说到Mysql的存储引擎,我们都并不陌生。但是我们要清楚存储引擎是基于表的,而非数据库。
下面了解一下Mysql的一些存储引擎
1、InnoDB
InnoDB可能是我们经常挂在嘴边的一个索引了,Mysql自从5.5.8版本之后就使用了InnoDB做为默认索引。为什么InnoDB如此优秀呢?
- 支持事务
- MVCC支持高并发性
- 行锁设计
- 外键
对于表中数据的存储,InnoDB存储引擎采用了聚集(clustered)的方式,因此每张表的存储都是按主键的顺序进行存放。如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。
2、MyISAM
相比于InnoDB引擎,MyISAM存储引擎不支持事务、表锁设计,支持全文索引。MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。
MyISAM存储引擎的另一个与众不同的地方是它的缓冲池只缓存索引文件,而并不缓冲数据文件,并且MyISAM的表是有存储大小限制的,在MySQL 5.0版本之前,MyISAM默认支持的表大小为4GB,如果需要支持大于4GB的MyISAM表时,则需要制定MAX_ROWS和AVG_ROW_LENGTH属性。从MySQL 5.0版本开始,MyISAM默认支持256TB的单表数据。
3、NDB
NDB存储引擎是一个集群式存储引擎,采用share nothing的集群机构,所以能提供更高的可用性。NDB的特点是将数据全部放在内存中因此主键查找的速度极快,并且通过添加NDB数据存储节点可以线性地提高数据库性能,是高可用、高性能的集群系统。
但是NDB有一个非常糟糕的问题,那就是它的join是在mysql数据库层实现的而不是在存储引擎层实现,所以NDB在进行复杂连接查询操作的时候需要花费很大的网络开销,查询起来非常慢!
4、Memory
Memory存储引擎将数据存放在内存中,如果遇到数据奔溃或者服务重启,那么则会丢失所有的数据,因此Memory索引不适用需要持久化存储的情况。它非常适合用于临时存储数据的临时表。Memory默认使用的哈希索引。
mysql因为其插件式的索引结构设计以及开源特性,还有很多其他类型的索引,我们可以通过SHOW ENGINES语句查看当前使用的MySQL数据库所支持的存储引擎,也可以通过查找information_schema架构下的ENGINES表。