超详细!MyISAM和InnoDB到底有什么区别?!(12个区别与选择依据)

前言

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

一:概述MyISAM和InnoDB

  • **InnoDB:**MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎。

    • 它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回滚。
    • InnoDB的性能与自动崩溃恢复的特性,使得它在非事务存储需求中也很流行。
    • 除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎
  • **MyISAM:**在MySQL 5.1 及之前的版本,MyISAM是默认引擎。

    • 是 MySQL数据库服务器中的组件,负责为数据库执行实际的数据I/O操作

    • MyISAM提供的大量的特性,包括全文索引、压缩、空间函数(GIS)等

    • 但MyISAM并不支持事务以及行级锁,而且一个毫无疑问的缺陷是崩溃后无法安全恢复

    • 正是由于MyISAM引擎的缘故,即使MySQL支持事务已经很长时间了,在很多人的概念中MySQL还是非事务型数据库

    • 尽管这样,它并不是一无是处的。对于只读的数据,或者表比较小,可以忍受修复操作,则依然可以使用MyISAM(但请不要默认使用MyISAM,而是应该默认使用InnoDB)

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

区别1:事务支持

  • MyISAM:不支持事务,强调的是性能。

  • InnoDB:支持事务:支持4个事务隔离级别

区别2:表锁差异

  • MyISAM:表级锁定形式,数据在更新时锁定整个表

  • InnoDB:行级锁定,但是全表扫描仍然会是表级锁定

区别3:读写过程

  • MyISAM:数据库在读写过程中相互阻塞

    • 会在数据写入的过程阻塞用户数据的读取
    • 也会在数据读取的过程中阻塞用户的数据写入
  • InnoDB:读写阻塞与事务隔离级别相关

区别4:缓存特性

  • MyISAM:可通过key_buffer_size来设置缓存索引,提高访问性能,减少磁盘I/O的压力

    • 但缓存只会缓存索引文件,不会缓存数据
  • InnoDB:具有非常高效的缓存特性:能缓存索引,也能缓存数据

区别5:存储方式

  • MyISAM:釆用 MyISAM存储引擎数据单独写入或读取,速度过程较快且占用资源相对少

  • InnoDB:表与主键以簇的方式存储

区别6:外键支持

  • MyISAM:MyISAM存储引擎它不支持外键约束

  • InnoDB:支持外键约束

区别7:全文索引

  • MyISAM:只支持全文索引

  • InnoDB:5.5以前不支持全文索引,5.5版本以后支持全文索引

区别8:在磁盘上的存储类型

  • MyISAM:每个 MyISAM在磁盘上存储成三个文件,每一个文件的名字以表的名字开始,扩展名指出文件类型

    • MyISAM在磁盘上存储的文件
    • .frm文件存储表定义
    • 数据文件的扩展名为.MYD( MYData)
    • 索引文件的扩展名是.MYI( MYIndex)
  • InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB

区别9:存储空间

  • MyISAM:支持三种不同的存储格式:

    • 静态表(默认,但是注意数据末尾不能有空格,会被去掉)
    • 动态表
    • 压缩表
    • 当表在创建之后并导入数据之后,不会再进行修改操作,可以使用压缩表,极大的减少磁盘的空间占用
  • InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引

区别10:表主键

  • MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址
  • InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值

区别11:表的具体行数

  • MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值

  • InnoDB:没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样

区别12:读写性能

  • MyISAM:读取性能优越,但是写入性能差

    • 如果执行大量的select,MyISAM是更好的选择
  • InnoDB:写入性能较强

    • 如果执行大量的insert或者update,InnoDB是更好的选择

二:选择存储引擎的依据

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

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

  • 支持的字段和数据类型
    ●所有引擎都支持通用的数据类型
    ●但不是所有的引擎都支持其它的字段类型,如二进制对象

  • 锁定类型:不同的存储引擎支持不同级别的锁定
    ●表锁定
    ●行锁定

  • 索引的支持
    ●建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能
    ●不同的存储引擎提供不同的制作索引的技术
    ●有些存储引擎根本不支持索引

  • 事务处理的支持

    ●事务处理功能通过提供在向表中更新和插入信息期间的可靠性
    ●可根据企业业务是否要支持事务选择存储引擎

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

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

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

  • 业务需要事务的支持

  • 行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成

  • 业务数据更新较为频繁的场景,如:论坛,微博等

  • 业务数据一致性要求较高,例如:银行业务

  • 硬件设备内存较大,利用 Innodb较好的缓存能力来提高内存利用率,减少磁盘I/O的压力
    DB?

  • 业务需要事务的支持

  • 行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成

  • 业务数据更新较为频繁的场景,如:论坛,微博等

  • 业务数据一致性要求较高,例如:银行业务

  • 硬件设备内存较大,利用 Innodb较好的缓存能力来提高内存利用率,减少磁盘I/O的压力

发布了94 篇原创文章 · 获赞 60 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/CN_TangZheng/article/details/103858444