以下介绍几种最常见的存储引擎 MyISAM、innodb、CSV、Archive、Memory
注意:一个库中尽量不要混合使用多种存储引擎。使用Innodb已经能满足大多数使用情况要求。
MyISAM
1、并发性和锁级别
该存储引擎对于大量读的环境并发性比较不错,但是由于它的锁级别是表锁,所以大量写的并发性比较差。
2、支持全文索引和数据压缩
支持数据压缩(一般针对数据不会变动的表)myisampack。已压缩的表不能写操作,只能读。
3、限制
- Mysql版本 < 5.0时,默认表大小为4G,如果要存储大表,需要配置 MAX_Rows 和 AVG_ROW_LENGTH两个参数
- Mysql版本 >5.0时,支持256TB
4、适用场景
- 非事务型应用
- 只读类应用
- 空间类应用(如通过位置坐标计算出周围的超市)
Innodb
该存储引擎通过表空间存储数据,可以通过查看 innodb_file_per_table 参数来确定表空间适用方式:
- 值为 OFF:所有表的数据共享系统表空间,文件名为ibdataX(X代表数字)
- 值为 ON:每个表使用独立的表空间,文件名为TABLENAME.ibd
建议使用独立表空间:
1、系统表空间无法简单的收缩文件大小,不利于空间回收。独立表空间可使用optimize table命令收缩
2、系统表空间容易产生I/O瓶颈。独立表空间可以同时向多个文件刷新数据
把原来存在于系统表空间的表转移到独立表空间的方法:
1、使用mysqldump导出所有数据库表数据
2、停止Mysql服务,修改参数,并删除Innodb相关文件
3、重启Mysql,重建Innodb系统表空间
4、重新导入数据
innodb支持事务
存在两种日志:Redo Log(innodb_log_buffer_size配置,存储已提交的事务) 和 Undo Log(innodb_log_files_in_group配置,存储未提交的事务)
Innodb特性
1、支持行级锁
2、行级锁可以最大程度支持并发
3、行级锁是由存储引擎层实现的
4、Mysql版本>5.7, innodb支持全文索引和空间函数
两个概念
阻塞:多个事务之间排队延迟的现象
死锁:多个事务相互等待对方使用的资源,少量死锁系统会选择一个占用系统资源最少的进行回滚。大量死锁影响系统性能。
Innodb状态检查命令:show engine innodb status(Mysql版本不同,可能结果不同)
CSV
特征:
1、数据以文本的形式存放在文件中
2、.CSV文件存储表数据
3、.CSM文件存储表的元数据,如表状态和数据量
4、.frm文件存储表结构信息
5、所有列不能为NULL
6、不支持索引,不适合大表不适合在线处理
7、可以对数据文件直接进行编辑
使用场景:
适合数据交换的中间表
Archive
特征:
1、以zlib对表数据进行压缩,磁盘I/O更少
2、数据存储在ARZ为后缀的文件中
3、只支持insert和select操作
4、只允许在自增ID列上加索引
使用场景:
日志和数据采集类应用
Memory
特征:
1、支持HASH和BTree索引(等值查找用HASH,范围查找用BTree)
2、所有字段都为固定长度
3、不支持BLOG和TEXT大字段类型
4、使用表级锁
5、最大值由max_heap_table_size决定,默认16M,修改之后对已存在表无效,需要重建表
使用场景:
1、用于查找或者映射表,比如邮编和地区的对应表
2、用于保存数据分析中产生的中间表
3、用于缓存周期性聚合数据的结果表
Memory数据易丢失,所以要求数据可再生