【编程学习】Mysql存储引擎分析——MyISAM和InnoDB到底有什么区别

原文链接:

前言

存储引擎就是 MySQL将数据存储在文件系统中的存储方式或者存储格式,目前 MySQL常用的两种存储引擎就是
MyISAM和InnoDB

概述MyISAM和InnoDB

  • InnoDB:MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎。
    • 它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回滚。InnoDB的性能与自动崩溃恢复的特性,使得它在非事务存储需求中也很流行。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
  • MyISAM:在MySQL 5.1 及之前的版本,MyISAM是默认引擎。
    • MyISAM是 MySQL数据库服务器中的组件,负责为数据库执行实际的数据I/O操作;它提供的大量的特性,包括全文索引、压缩、空间函数(GIS)等;但MyISAM并不支持事务以及行级锁,而且一个毫无疑问的缺陷是崩溃后无法安全恢复。正是由于MyISAM引擎的缘故,即使MySQL支持事务已经很长时间了,在很多人的概念中MySQL还是非事务型数据库。尽管这样,它并不是一无是处的。对于只读的数据,或者表比较小,可以忍受修复操作,则依然可以使用MyISAM(但请不要默认使用MyISAM,而是应该默认使用InnoDB)。

二:区别详解(12大区别)

区别 MyISAM InnoDB
事务支持 不支持事务,强调的是性能。 支持事务:支持4个事务隔离级别
表锁差异 表级锁定形式,数据在更新时锁定整个表 行级锁定,但是全表扫描仍然会是表级锁定
读写过程 数据库在读写过程中相互阻塞:会在数据写入的过程阻塞用户数据的读取,也会在数据读取的过程中阻塞用户的数据写入 读写阻塞与事务隔离级别相关
缓存特性 可通过key_buffer_size来设置缓存索引,提高访问性能,减少磁盘I/O的压力;但缓存只会缓存索引文件,不会缓存数据 具有非常高效的缓存特性:能缓存索引,也能缓存数据
存储方式 釆用 MyISAM存储引擎数据单独写入或读取,速度过程较快且占用资源相对少 表与主键以簇的方式存储
外键支持 MyISAM存储引擎它不支持外键约束 支持外键约束
全文索引 只支持全文索引 5.5以前不支持全文索引,5.5版本以后支持全文索引
在磁盘上的存储类型 每个 MyISAM在磁盘上存储成三个文件,每一个文件的名字以表的名字开始,扩展名指出文件类型:
表定义:.frm文件存储
数据文件:.MYD( MYData)
索引文件:.MYI( MYIndex)
所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB
存储空间 MyISAM在磁盘上存储的文件 .frm文件存储表定义 数据文件的扩展名为.MYD( MYData) 索引文件的扩展名是.MYI( MYIndex)支持三种不同的存储格式:静态表(默认) 、动态表、压缩表 当表在创建之后并导入数据之后,不会再进行修改操作,可以使用压缩表,极大的减少磁盘的空间占用 需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引
表主键 允许没有任何索引和主键的表存在,索引都是保存行的地址 如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值
表的具体行数 保存有表的总行数,如果select count(*) from table;会直接取出出该值 没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了where条件后,两种引擎的处理的方式都一样
读写性能 读取性能优越,但是写入性能差,如果执行大量的select,MyISAM是更好的选择 写入性能较强,如果执行大量的insert或者update,InnoDB是更好的选择

选择存储引擎的依据

生产环境中依据什么选择存储引擎?

需要考虑毎个存儲引擎提供了哪些不同的核心功能及应用场景

  • 支持的字段和数据类型:所有引擎都支持通用的数据类型,但不是所有的引擎都支持其它的字段类型,如二进制对象。
  • 锁定类型:不同的存储引擎支持不同级别的锁定:表锁定,行锁定。
  • 索引的支持:建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能,不同的存储引擎提供不同的制作索引的技术,有些存储引擎根本不支持索引。
  • 事务处理的支持:事务处理功能通过提供在向表中更新和插入信息期间的可靠性,可根据企业业务是否要支持事务选择存储引擎。

什么生产场景适合使用MyISAM?

  • 公司业务不需要事务的支持
  • 一般单方面读取数据比较多的业务,或单方面写入数据比较多的业务
  • MyISAM存储引擎数据读写都比较频繁场景不适合
  • 使用读写并发访问相对较低的业务
  • 数据修改相对较少的业务
  • 对数据业务一致性要求不是非常高的业务
  • 服务器硬件资源相对比较差

什么生产场景适合使用InnoDB?

  • 业务需要事务的支持
  • 行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成
  • 业务数据更新较为频繁的场景,如:论坛,微博等
  • 业务数据一致性要求较高,例如:银行业务
  • 硬件设备内存较大,利用 Innodb较好的缓存能力来提高内存利用率,减少磁盘I/O的压力
    DB?
  • 业务需要事务的支持
  • 行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成
  • 业务数据更新较为频繁的场景,如:论坛,微博等
  • 业务数据一致性要求较高,例如:银行业务
  • 硬件设备内存较大,利用 Innodb较好的缓存能力来提高内存利用率,减少磁盘I/O的压力