MYSQL高级(架构篇)——存储引擎介绍(InnoDB和MyISAM对比)

一、MYSQL系统默认的存储引擎

在MYSQL5.5以后默认采用InnoDB,之前采用MyISAM。
我们可以用

show variables like '%storage_engine%';
#或
SELECT @@default_storage_engine;

来查看系统默认的存储引擎:MYSQL高级(架构篇)——存储引擎介绍(InnoDB和MyISAM对比)_第1张图片


如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用 InnoDB 作为表的存储引擎。 如果我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:

SET DEFAULT_STORAGE_ENGINE=MyISAM;

或者修改 my.cnf 文件:

default-storage-engine=MyISAM
# 重启服务
systemctl restart mysqld.service

二、具体介绍

2.1 InnoDB 引擎:具备外键支持功能的事务存储引擎

  1. InnoDB是MySQL的 默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback);
  2. 除了增加和查询外,还需要更新、删除操作,那么,应优先选择InnoDB存储引擎;
  3. 数据文件结构:
    • 表名.frm 存储表结构(MySQL8.0时,合并在表名.ibd中)
    • 表名.ibd 存储数据和索引
  4. InnoDB是 为处理巨大数据量的最大性能设计 。因为它支持行锁,适用于处理高并发操作;
  5. InnoDB不仅缓存索引还要缓存真实数据, 对内存要求较 高 ,而且内存大小对性能有决定性的影响;
  6. 对比MyISAM的存储引擎, InnoDB写的处理效率差一些 ,并且会占用更多的磁盘空间以保存数据和索引;

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

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

2.3 InnoDB vs. MyISAM

对于InnoDB,它提供了良好的事务管理、崩溃修复能力和并发控制。因为它支持事务,所以对于要求事务完整性的场合需要选择InnoDB,比如数据要频繁更新、删除,对数据准确性要求高的场合等。
缺点是读写效率差占用的数据空间相对较大

对于MyISAM,如果是小型应用,系统以读操作和插入为主,可以选择。
优势在于占用空间小、处理速度快;缺点就是不支持事务,崩溃后无法安全恢复 。
下面通过一个表格来展示:

对比项 MyISAM InnoDB
外键 ×
事务 ×
锁机制 表锁,不适合高并发操作 行锁,操作只针对一行,适合高并发
缓存 只缓存索引,不缓存数据 不仅缓存索引还要缓存真实数据
空间使用
索引 非聚簇索引,索引文件的数据域存储指向数据文件的指针 聚簇索引,主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;

你可能感兴趣的:(mysql,sql,java,后端)