MySQL存储引擎


数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。Mysql的核心就是存储引擎。

Mysql提供了不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在Mysql中,不需要在整个服务器中使用一种引擎。针对具体要求可以对每一个表使用不同的存储引擎。

Mysql支持多种存储引擎,如InnoDB、MylSAM、Memory、Merge、Archive、CSV、Federated等等。

一、MylSAM存储引擎

1.1 MylSAM存储引擎的特点

  • Mysql 5.5之前默认使用MylSAM引擎,Mysql5.5之后默认使用InnoDB引擎;
  • MylSAM引擎读取数据较快,占用资源较少,不支持事务,不支持外键约束,但支持全文索引;
  • 读写相互阻塞,也就是说读数据时就不可写数据,学数据时就不可读数据;
  • MylSAM引擎只能缓存索引,而不能缓存数据;

1.2 MylSAM使用场景

  • 不需要事务支持的业务;
  • 适用于读数据较多的业务;
  • 并发相对较低、数据修改相对较少的业务;
    -硬件资源较差的机器可以考虑使用MylSAM引擎;

二、InnoDB存储引擎

2.1 InnoDB存储引擎的特点

  • 事务型数据库的首选引擎,支持事务安全表,支持行锁定和外键,Mysql5.5.5版本之后,InnoDB作为默认存储引擎;
  • 具有提交、回滚和崩溃恢复能力的事务安全存储引擎,能处理巨大数据量,性能及效率高,完全支持外键完整性约束;
  • 具有非常高效的缓存特性,可以缓存索引也可缓存数据,对硬件要求较高;
  • 使用InnoDB时,将在Mysql数据目录下的创建一个名为ibdata1的10M大小的自动扩展数据文件,以及两个ib_logfile0和ib_logfile1的5M大小的日志文件;

2.2 InnoDB使用场景

  • 需要数据支持的业务,高并发的业务;
  • 数据更新较为频繁的场景,比如BBS、SNS、微博等;
  • 数据一致性要求较高的业务,比如充值转账、银行卡转账;

三、Memory存储引擎

3.1 Memory存储引擎的特点

  • Memory存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问;
  • Memory存储引擎执行HASH和BTREE索引,不支持BLOB和TEXT列,支持AUTO_INCREMENT列和对可包含NULL值的列的索引;
  • 当不再需要Memory表的内容时,要释放被Memory表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表;

四、如何选择合适的存储引擎

不同的业务需要选择不同的而存储引擎,可以参考以下几点进行选择:

  • 如果要提供提交、回滚和崩溃恢复能力的事务安全能力,并要求实现并发控制,InnoDB是个很好的选择;
  • 如果数据表主要用来插入和查询记录,则MylSAM引擎能提供较高的处理效率;
  • 如果只是临时存放数据,数据量不大,并且不需要较高的安全性,可以选择将数据保存在内存中的Memory引擎,使用该引擎作为临时表,存放查询的中间结果;
  • 如果只有INSERT和SELECT操作,可以选择Archive引擎,支持高并发的插入操作,如记录日志信息,可以使用Archive引擎;

主要的三个数据引擎所支持的功能如下表:

功能 MylSAM Memory InnoDB
存储限制 256TB RAM 64TB
支持事务 NO NO YES
支持全文索引 YES NO NO
支持数据索引 YES YES YES
支持哈希缓存 NO YES NO
支持数据缓存 NO N/A YES
支持外键 NO NO YES

五、查看及修改表的默认存储引擎

show engines\G;         #查看数据库支持的索引
show variables like 'default_storage_engine';       #查看数据库默认的存储引擎
show variables like '%engine%';        #查看全部的默认引擎
show create table t1\G;            #查看t1表默认的引擎
alter table t1 engine=myisam;      #修改t1表的默认引擎为MylSAM
posted @ 2020-12-27 14:19  吕振江  阅读(94)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end