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引擎:具备外键支持功能的事务存储引擎

  1. Mysql从3.23.34a开始就包含InnoDB存储引擎。大于等于5.5之后,默认采用InnoDB存储引擎
  2. InnoDB是Mysql默认事务型引擎,它被涉及来处理大量的短期(short-lived)事务。可以确保事务的完整提交(commit)和回滚(rollback)。
  3. 除了增加和查询操作外,还有更新、删除操作,那么就应该优先选择InnoDB存储引擎。
  4. 除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB存储引擎
  5. 数据文件结构:表名.frm(存储表结构,在mysql8.0 之后合并到表名.ibd中了);表名.ibd(不出数据和索引)。
  6. InnoDB是为处理巨大数据量的最大性能涉及
  7. 对比MyISAM存储引擎,InnoDB写的处理效率要差一些,并且会占用更多的磁盘空间来保存数据和索引。
  8. MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引,还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响。

4.2 MyISAM引擎:主要的非事务处理存储引擎

  1. MyISAM提供了大量的特性,包括全文索引、压缩、空间函数等。但是MyISAM不支持事务、行级锁、外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复
  2. MyISAM的优势是访问速度快,适合对事务完整性没有要求,或者以SELECT, INSERT 为主的应用
  3. 针对数据统计有额外的常数存储,因此count(*)的查询效率很高
  4. 数据文件结构:表名.frm(存储表结构);表名.MYD(存储数据);表名.MYI(存储索引);
  5. 应用场景:以读为主的业务。

4.3 Archive引擎:主要用于数据存档

  1. archive是归档的意思,仅仅支持插入和查询两个功能
  2. 在Mysql5.5 以后支持索引功能。
  3. 拥有很好的压缩机制,使用zlib压缩率,在记录请求的时候,实时地进行压缩,经常被用来作为仓库使用。
  4. 创建ARCHIVE表时,存储引擎会创建名称以表名开头的文件,数据文件的扩展名为.ARZ。
  5. Archive存储引擎采用了行级锁。该Archive引擎支持AUTO_INCREMENT列属性。AUTO_INCREMENT列可以具有唯一索引或非唯一索引。尝试在任何其他列上创建索引会导致错误。
  6. Archive表适合日志和数据采集(档案)类的应用;适合存储大量的独立的作为历史记录的数据。拥有很高的插入速度,但是对查询的支持较差

4.4 CSV引擎:存储数据时,以逗号分隔各个数据项

  1. CSV引擎可以将普通的CSV文件作为Mysql的表来处理,单不支持索引;
  2. CSV引擎可以作为一种数据交换的机制,非常有用;
  3. CSV存储的数据直接可以在操作系统里,用文本编辑器,或者excel读取;
  4. 对于数据的快速导入、导出有明显优势。

4.5 Memory引擎:置于内存的表

概述:
Memory采用的逻辑介质是内存,因此响应速度很快,但是当Mysqld守护进程崩溃的时候,数据会丢失。

另外,要求存储的数据是长度不变的格式,因此,blob和text类型的数据不可用。

主要特征:

  1. Memory同时支持哈希(HASH)索引和B+树索引。其默认使用哈希索引,速度比使用B+树索引快。
  2. Memory表至少比MyISAM表快一个数量级
  3. Memory表的大小是受到限制的。表的大小主要取决于两个参数,分别是max_rows和max_heap_table_size。其中,max_rows可以在创建表时指定。max_heap_table_size的大小默认为16M,可以按需要进行扩大。
  4. 数据文件与索引文件分开存储。每个基于Memory存储引擎的表实际对应一个磁盘文件,该文件的文件名与表名相同,类型为frm类型,该文件中只存储表的结构,而其数据文件都是存储在内存中的。
  5. 缺点:数据容易丢失,生命周期短。基于这个缺陷,选择Memory存储引擎需要特别小心。

使用Memory存储引擎的场景:

  1. 目标数据比较小,而且需要非常频繁地进行访问,在内存中存放数据,如果太大的数据会造成内存溢出。可以通过参数max_heap_table_size控制Memory表的大小。
  2. 如果数据是临时的,而且必须立即可用得到,那么就可以放到内存中。
  3. 存储在Memory表中的数据如果突然间丢失的话也没有太大的关系

5、MyISAM和InnoDB的对比

Mysql 5.5之前的默认存储引擎是MyISAM,5.5之后改为了InnoDB。

InnoDB存储引擎,提供了良好的事务管理、崩溃修复能力和并发控制。因为InnoDB存储引擎支持事务,所以对于要求事务完整性的场合需要选择InnoDB。比如数据操作除了插入和查询之外,还包含很多更新、删除操作,向财务系统等对数据准确性要求较高的系统。它的缺点是读写效率稍差,占用的数据空间相对比较大

MyISAM存储引擎,如果是小型应用,系统以插入操作和查询操作为主,只有很少的更新、删除操作,并且对事务的要求没有那么高,那么可以选择这个存储引擎。MyISAM存储引擎的优势在于占用空间小,处理速度快缺点是不支持事务的完整性和并发性。

对比项MyISAMInnoDB
外键不支持支持
事务不支持支持
行表锁表锁:即使操作一条记录,也会锁住整个表,因此不适合高并发的操作行锁:操作时只锁某一行,不对其他行有影响,适合高并发的操作
缓存只缓存索引,不缓存真实数据不仅缓存索引,还要缓存真实数据,因此对内存要求较高,而且内存大小对性能有决定性的影响
关注点性能:节省资源、消耗少、简单业务事务:并发写、事务、更大资源

小结一下:
InnoDB相对MyISAM的优点?
1)MyISAM不支持外键,而InnoDB支持外键。
2)MyISAM不支持事务,而InnoDB支持事务。因此当除了查询和插入操作之外,还有比较多的更新和删除操作,优先考虑InnoDB。
3)MyISAM仅支持表锁,即使操作一条记录,也会锁住整个表。而InnoDB支持行锁,操作时只锁某一行,不对其他行有影响,因此InnoDB适合高并发的操作。

什么时候选择其他存储引擎?
1)如果是小型应用,系统以插入操作和查询操作为主,只有很少的更新、删除操作,并且对事务的要求没有那么高,那么可以选择MyISAM存储引擎。MyISAM存储引擎的优势在于占用空间小,处理速度快缺点是不支持事务的完整性和并发性。
2)如果是存储历史记录之类的不再修改的数据,可以使用Archive。Archive表仅支持插入和查询两个操作,拥有很好的压缩机制。适合日志和数据采集(档案)类的应用,拥有很高的插入速度,但是对查询的支持较差。
3)如果数据文件格式是CSV格式的,可以优先使用CSV引擎

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值