问题
说一说 MySQL 几种常用的存储引擎?
它们的区别是什么?
解析
前言
存储引擎 (Storage Engine) 就是指表的类型以及表在计算机上的存储方式.
存储引擎的概念是 MySQL 的特点, 提供了存储引擎接口, 有兴趣的开发者可以编写自己的存储引擎. Oracle,SQL Server 面试的时候不会问到存储引擎, 所以这里不再叙述.
存储引擎查看
在 mysql 客户端中, 使用以下命令可以查看 MySQL 支持的引擎:
mysql> show engines;
InnoDB 存储引擎
在 MySQL 从 3.23.34a 开始包含 InnoDB. 有以下特点:
它遵循 ACID 模式设计, 提供了具有提交, 回滚和崩溃恢复能力的事务安全.
为了维护数据完整性, InnoDB 还支持外键完整性约束.
支持自动增加列 AUTO_INCREMENT(自动增长列)属性.
InnoDB 提供行级锁, 大幅度提高了多用户并发操作的性能.
总结: InnoDB 的优势在于提供了良好的事务处理, 崩溃修复能力和并发控制. 缺点是读写效率较差, 占用的数据空间相对较大. 使用场景, 如: 银行(对事务的完整性要求比较高), 售票(要求实现并发控制).
MyISAM 存储引擎
MyISAM 基于 ISAM 存储引擎, 并对其进行扩展. MyISAM 拥有较高的插入, 查询速度, 但不支持事物. 曾经是 MySQL 的默认存储引擎.
MyISAM 的表存储成 3 个文件. 文件的名字与表名相同. 文件类型: 文件存储表定义的扩展名为. frm, 数据文件的扩展名为. MYD(MYData), 索引文件的扩展名时. MYI(MYIndex).
基于 MyISAM 存储引擎的表支持 3 种不同的存储格式. 包括静态型, 动态型和压缩型. 其中, 静态型是 MyISAM 的默认存储格式, 它的字段是固定长度的; 动态型包含变长字段, 记录的长度不是固定的; 压缩型需要用到 myisampack 工具, 占用的磁盘空间较小.
总结: MyISAM 的优势在于占用空间小, 处理速度快. 缺点是不支持事务的完整性和并发性.
MEMORY 存储引擎
MEMORY 是 MySQL 中一类特殊的存储引擎. 它使用存储在内存中的内容来创建表, 而且数据全部放在内存中.
数据存储在内存中, 这样有利于快速处理, 提高整个表的效率. 这就要求, 服务器需要有足够的内存来维持 MEMORY 存储引擎的表的使用. 如果不需要了, 可以释放内存, 甚至删除不需要的表.
总结: MEMORY 用到的很少, 因为它是把数据存到内存中, 如果重启或者关机, 所有数据都会消失.
Archive 存储引擎
用于数据归档, 压缩比非常高, 存储空间大概是 innodb 的 10-15 分之一. 所以它用来存储历史数据非常适合, 如记录日志信息. archive 存储引擎支持 insert,replace 和 select 操作, 但是不支持 update 和 delete, 不支持事务, 其设计目标只是提供高速的插入和压缩功能.
MERGE 存储引擎
MERGE 存储引擎, 也被认识为 MRG_MyISAM 引擎, 是一组 MyISAM 表的组合, 这些 MyISAM 表结构必须完全相同.
举个例子:
我们现在要记录用户登录和操作的日志, 假设这里使用 MyISAM 引擎建表. 为了防止历史数据积累, 使表过大. 一般的做法是将数据分成很多表, 每个名称与特定的时间相关. 比如 `t_log_201801`,`t_log_201802`.
假设 `t_log_201801` 表有以下数据:
`t_log_201801` 表
假设 `t_log_201802` 表有以下数据:
`t_log_201802` 表
如果我们要查 Tom 的登录情况, 可以用 join 联立多张表. 也可以用 MERGE 存储引擎将这些表合并成一张 "虚拟表".
- CREATE TABLE IF NOT EXISTS `u_log` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `log` varchar(50) DEFAULT NULL,
- `username` varchar(50) DEFAULT NULL,
- INDEX(id)
- ) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 UNION=(t_log_201801,t_log_201802)
查询 `u_log` 后, 得:
`u_log` 表
总结: 主要用于合并查询多张结构相同的表.
附录
如何指定表使用某种存储引擎?
- CREATE TABLE IF NOT EXISTS `t_test` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `log` varchar(50) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM;
后面跟 ENGINE=MyISAM, 即可指定使用 MyISAM 存储引擎, 以此类推.
2. 如何查看表使用了某种存储引擎?
show create table `t_test`; --`t_test` 为表名
3. 如何修改表使用的存储引擎?
alter table `t_test` engine=MyISAM; --`t_test` 为表名
4. 附上表格:
原创作品, 本系列为面试题
关注小编, 后续会推出更多面试系列作品
来源: http://www.92to.com/bangong/2018/04-22/33642273.html