MySQL 数据库的体系架构如下图所示:
从上图中可以看出, MySQL 主要分为以下几个组件:
连接池组件
管理服务和工具组件
SQL 接口组件
分析器组件
优化器组件
缓冲组件
插件式存储引擎
物理文件
一, 存储引擎
存储引擎 : 其实就是指定 表 如何存储数据, 如何为存储的数据 建立索引以及 如何更新, 查询数据等技术实现的方法. 因为在关系数据库中数据的存储是以表的形式存储的, 所以存储引擎也可以称为表类型(即存储和操作此表的类型)
了解: 在 Oracle 和 SQL Server 等数据库中只有一种存储引擎, 所有数据存储管理机制都是一样的. 而 MySQL 数据库提供了多种存储引擎. 用户可以根据不同的需求为数据表选择不同的存储引擎, 用户也可以根据自己的需要编写自己的存储引擎
下表显示了各种存储引擎的特性:
特性 | MyISAM | InnoDB | Memory | Archive | NDB |
---|---|---|---|---|---|
存储限制 | 没有 | 64TB | 有 | 没有 | 没有 |
事务 | 支持 | 支持 | |||
锁粒度 | 表 | 行 | 表 | 行 | 页 |
B 树索引 | 支持 | 支持 | 支持 | 支持 | |
哈希索引 | 支持 | 支持 | |||
全文索引 | 支持 | ||||
集群索引 | 支持 | ||||
数据缓存 | 支持 | 支持 | |||
索引缓存 | 支持 | 支持 | 支持 | ||
数据压缩 | 支持 | 支持 | |||
批量插入 | 高 | 相对低 | 高 | 非常高 | 高 |
内存消耗 | 低 | 高 | 中 | 低 | 低 |
外键支持 | 支持 | ||||
复制支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
查询缓存 | 支持 | 支持 | 支持 | 支持 | 支持 |
备份恢复 | 支持 | 支持 | 支持 | 支持 | 支持 |
集群支持 | 支持 |
其中最常见的两种存储引擎是 MyISAM 和 InnoDB
MyISAM 存储引擎
1,MyISAM 是 MySQL (MySQL 5.5 版本以前) 原来的默认存储引擎.
2,MyISAM 这种存储引擎不支持事务, 不支持行级锁, 只支持并发插入的表锁.
3,MyISAM 类型的表支持三种不同的存储结构: 静态型, 动态型, 压缩型.
(1)静态型: 就是定义的表列的大小是固定(即不含有: xblob,xtext,varchar 等长度可变的数据类型), 这样 MySQL 就会自动使用静态 myisam 格式.
使用静态格式的表的性能比较高, 因为在维护和访问的时候以预定格式存储数据时需要的开销很低. 但是这高性能是用空间换来的, 因为在定义的时候是固定的, 所以不管列中的值有多大, 都会以最大值为准, 占据了整个空间.
(2)动态型: 如果列 (即使只有一列) 定义为动态的(xblob, xtext, varchar 等数据类型), 这时 myisam 就自动使用动态型, 虽然动态型的表占用了比静态型表较少的空间, 但带来了性能的降低.
(3)压缩型: 如果在这个数据库中创建的是在整个生命周期内只读的表, 则这种情况就是用 myisam 的压缩型表来减少空间的占用.
压缩方式参考官方文档: https://dev.mysql.com/doc/refman/5.6/en/myisampack.html
4,MyISAM 也是使用 B+tree 索引但是和 Innodb 的在具体实现上有些不同.
InnoDB 存储引擎
(1)MySQL 默认存储引擎(MySQL 5.5 版本后).
(2)innodb 支持事务, 回滚以及系统崩溃修复能力和多版本迸发控制的事务的安全.
(3)innodb 支持自增长列(auto_increment), 自增长列的值不能为空,(一个表只允许存在一个自增, 并且要求自增列必须为索引)
(4)innodb 支持外键(foreign key) , 外键所在的表称为子表, 而所依赖的表称为父表.
(5)innodb 存储引擎支持行级锁.
(6)innodb 存储引擎索引使用的是 B+Tree
补充 3 点:
1. 大容量的数据集时趋向于选择 Innodb. 因为它支持事务处理和故障的恢复. Innodb 可以利用数据日志来进行数据的恢复. 主键的查询在 Innodb 也是比较快的.
2. 大批量的插入语句时 (这里是 INSERT 语句) 在 MyIASM 引擎中执行的比较的快, 但是 UPDATE 语句在 Innodb 下执行的会比较的快, 尤其是在并发量大的时候.
3. 两种引擎所使用的索引数据结构是什么?
答案: 都是 B + 树!
MyIASM 引擎, B + 树的数据结构中存储的内容实际上是实际数据的地址值. 也就是说它的索引和实际数据是分开的, 只不过使用索引指向了实际数据. 这种索引的模式被称为非聚集索引.
Innodb 引擎的索引的数据结构也是 B + 树, 只不过数据结构中存储的都是实际的数据, 这种索引有被称为聚集索引.
Memory 存储引擎
Memory 存储引擎 (之前称为 Heap) 将表中数据存放在内存中, 如果数据库重启或崩溃, 数据丢失, 因此它非常适合存储临时数据.
Archive 存储引擎
正如其名称所示, Archive 非常适合存储归档数据, 如日志信息. 它只支持 INSERT 和 SELECT 操作, 其设计的主要目的是提供高速的插入和压缩功能.
NDB 存储引擎
NDB 存储引擎是一个集群存储引擎, 类似于 Oracle 的 RAC, 但它是 Share Nothing(非共享)的架构, 因此能提供更高级别的高可用性和可扩展性. NDB 的特点是数据全部放在内存中, 因此通过主键查找非常快.
关于 NDB, 有一个问题需要注意, 它的连接 (join) 操作是在 MySQL 数据库层完成, 不是在存储引擎层完成, 这意味着, 复杂的 join 操作需要巨大的网络开销, 查询速度会很慢.
二, 测试存储引擎
创建三个表, 分别使用 innodb,myisam,memory 存储引擎, 进行插入数据测试
- create table t1(id int)engine=innodb;
- create table t2(id int)engine=myisam;
- create table t3(id int)engine=memory;
- # 看一下三个存储引擎创建的 表文件
- t1.frm t1.ibd
- t2.MYD t2.MYI t2.frm
- t3.frm
- # 细心的同学会发现最后的存储引擎只有表结构, 无数据
- #memory, 在重启 MySQL 或者重启机器后, 表内数据清空
重点[面试题]:
innodb 与 MyIASM 存储引擎的区别:
1.innodb 是 mysql5.5 版本以后的默认存储引擎, 而 MyISAM 是 5.5 版本以前的默认存储引擎.
2.innodb 支持事物, 而 MyISAM 不支持事物
3.innodb 支持行级锁. 而 MyIASM 它支持的是并发的表级锁.
4.innodb 支持外键, 而 MyIASM 不支持外键
5.innodb 与 MyIASM 存储引擎都采用 B+TREE 存储数据, 但是 innodb 的索引与数据存储在一个文件中, 这种方式我们称之为聚合索引.
而 MyIASM 则会单独创建一个索引文件, 也就是说, 数据与索引是分离开的
6. 在效率方面 MyISAM 比 innodb 高, 但是在性能方面 innodb 要好一点.
来源: http://www.bubuko.com/infodetail-2889681.html