Mysql高级篇学习总结5:存储引擎介绍
为了管理方便,人们把连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存储的功能划分为Mysql server的功能,把真实存取数据的功能划分为存储引擎的功能。
存储引擎就是指表的类型,以前叫做表处理器,后来改名为存储引擎。它的功能就是接收上层传下来的指令,然后对表中的数据进行提取或写入操作。
1、查看存储引擎
用 show engine 命令查看mysql提供了什么存储引擎:
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.03 sec)
2、设置系统默认的存储引擎
查看默认的存储引擎:
show variables like '%storage_engine%';
或者
SELECT @@default_storage_engine;
修改默认的存储引擎,临时的命令行的方式:
SET DEFAULT_STORAGE_ENGINE=MyISAM;
或者修改my.cnf文件:
default-storage-engine=MyISAM
# 重启服务
systemctl restart mysqld.service
3、设置表的存储引擎
可以为不同的表设置不同的存储引擎。
3.1 创建表时指定存储引擎
如果没有显示地指定表的存储引擎,那么就会使用默认的存储引擎。显示地指定存储引擎可以这么写:
CREATE TABLE 表名(
建表语句
) ENGINE=存储引擎名称;
比如可以创建一个存储引擎为MyISAM的表:
CREATE TABLE engine_demo_table(i int) ENGINE=MyISAM;
3.2 修改表的存储引擎
修改表的存储引擎的语句:
ALTER TABLE 表名 ENGINE=存储引擎名称;
比如将engine_demo_table表修改为InnoDB:
ALTER TABLE engine_demo_table ENGINE=InnoDB;
4、存储引擎介绍
4.1 InnoDB引擎:具备外键支持功能的事务存储引擎
- Mysql从3.23.34a开始就包含InnoDB存储引擎。大于等于5.5之后,默认采用InnoDB存储引擎。
- InnoDB是Mysql默认事务型引擎,它被涉及来处理大量的短期(short-lived)事务。可以确保事务的完整提交(commit)和回滚(rollback)。
- 除了增加和查询操作外,还有更新、删除操作,那么就应该优先选择InnoDB存储引擎。
- 除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB存储引擎。
- 数据文件结构:表名.frm(存储表结构,在mysql8.0 之后合并到表名.ibd中了);表名.ibd(不出数据和索引)。
- InnoDB是为处理巨大数据量的最大性能涉及。
- 对比MyISAM存储引擎,InnoDB写的处理效率要差一些,并且会占用更多的磁盘空间来保存数据和索引。
- MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引,还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响。
4.2 MyISAM引擎:主要的非事务处理存储引擎
- MyISAM提供了大量的特性,包括全文索引、压缩、空间函数等。但是MyISAM不支持事务、行级锁、外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。
- MyISAM的优势是访问速度快,适合对事务完整性没有要求,或者以SELECT, INSERT 为主的应用
- 针对数据统计有额外的常数存储,因此count(*)的查询效率很高
- 数据文件结构:表名.frm(存储表结构);表名.MYD(存储数据);表名.MYI(存储索引);
- 应用场景:以读为主的业务。
4.3 Archive引擎:主要用于数据存档
- archive是归档的意思,仅仅支持插入和查询两个功能。
- 在Mysql5.5 以后支持索引功能。
- 拥有很好的压缩机制,使用zlib压缩率,在记录请求的时候,实时地进行压缩,经常被用来作为仓库使用。
- 创建ARCHIVE表时,存储引擎会创建名称以表名开头的文件,数据文件的扩展名为.ARZ。
- Archive存储引擎采用了行级锁。该Archive引擎支持AUTO_INCREMENT列属性。AUTO_INCREMENT列可以具有唯一索引或非唯一索引。尝试在任何其他列上创建索引会导致错误。
- Archive表适合日志和数据采集(档案)类的应用;适合存储大量的独立的作为历史记录的数据。拥有很高的插入速度,但是对查询的支持较差。
4.4 CSV引擎:存储数据时,以逗号分隔各个数据项
- CSV引擎可以将普通的CSV文件作为Mysql的表来处理,单不支持索引;
- CSV引擎可以作为一种数据交换的机制,非常有用;
- CSV存储的数据直接可以在操作系统里,用文本编辑器,或者excel读取;
- 对于数据的快速导入、导出有明显优势。
4.5 Memory引擎:置于内存的表
概述:
Memory采用的逻辑介质是内存,因此响应速度很快,但是当Mysqld守护进程崩溃的时候,数据会丢失。
另外,要求存储的数据是长度不变的格式,因此,blob和text类型的数据不可用。
主要特征:
- Memory同时支持哈希(HASH)索引和B+树索引。其默认使用哈希索引,速度比使用B+树索引快。
- Memory表至少比MyISAM表快一个数量级。
- Memory表的大小是受到限制的。表的大小主要取决于两个参数,分别是max_rows和max_heap_table_size。其中,max_rows可以在创建表时指定。max_heap_table_size的大小默认为16M,可以按需要进行扩大。
- 数据文件与索引文件分开存储。每个基于Memory存储引擎的表实际对应一个磁盘文件,该文件的文件名与表名相同,类型为frm类型,该文件中只存储表的结构,而其数据文件都是存储在内存中的。
- 缺点:数据容易丢失,生命周期短。基于这个缺陷,选择Memory存储引擎需要特别小心。
使用Memory存储引擎的场景:
- 目标数据比较小,而且需要非常频繁地进行访问,在内存中存放数据,如果太大的数据会造成内存溢出。可以通过参数max_heap_table_size控制Memory表的大小。
- 如果数据是临时的,而且必须立即可用得到,那么就可以放到内存中。
- 存储在Memory表中的数据如果突然间丢失的话也没有太大的关系。
5、MyISAM和InnoDB的对比
Mysql 5.5之前的默认存储引擎是MyISAM,5.5之后改为了InnoDB。
InnoDB存储引擎,提供了良好的事务管理、崩溃修复能力和并发控制。因为InnoDB存储引擎支持事务,所以对于要求事务完整性的场合需要选择InnoDB。比如数据操作除了插入和查询之外,还包含很多更新、删除操作,向财务系统等对数据准确性要求较高的系统。它的缺点是读写效率稍差,占用的数据空间相对比较大。
MyISAM存储引擎,如果是小型应用,系统以插入操作和查询操作为主,只有很少的更新、删除操作,并且对事务的要求没有那么高,那么可以选择这个存储引擎。MyISAM存储引擎的优势在于占用空间小,处理速度快;缺点是不支持事务的完整性和并发性。
对比项 | MyISAM | InnoDB |
---|---|---|
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁:即使操作一条记录,也会锁住整个表,因此不适合高并发的操作 | 行锁:操作时只锁某一行,不对其他行有影响,适合高并发的操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引,还要缓存真实数据,因此对内存要求较高,而且内存大小对性能有决定性的影响 |
关注点 | 性能:节省资源、消耗少、简单业务 | 事务:并发写、事务、更大资源 |
小结一下:
InnoDB相对MyISAM的优点?:
1)MyISAM不支持外键,而InnoDB支持外键。
2)MyISAM不支持事务,而InnoDB支持事务。因此当除了查询和插入操作之外,还有比较多的更新和删除操作,优先考虑InnoDB。
3)MyISAM仅支持表锁,即使操作一条记录,也会锁住整个表。而InnoDB支持行锁,操作时只锁某一行,不对其他行有影响,因此InnoDB适合高并发的操作。
什么时候选择其他存储引擎?:
1)如果是小型应用,系统以插入操作和查询操作为主,只有很少的更新、删除操作,并且对事务的要求没有那么高,那么可以选择MyISAM存储引擎。MyISAM存储引擎的优势在于占用空间小,处理速度快;缺点是不支持事务的完整性和并发性。
2)如果是存储历史记录之类的不再修改的数据,可以使用Archive。Archive表仅支持插入和查询两个操作,拥有很好的压缩机制。适合日志和数据采集(档案)类的应用,拥有很高的插入速度,但是对查询的支持较差。
3)如果数据文件格式是CSV格式的,可以优先使用CSV引擎。