【编程学习】Mysql存储引擎分析——MyISAM和InnoDB到底有什么区别
【编程学习】Mysql存储引擎分析——MyISAM和InnoDB到底有什么区别
6Young原文链接:
前言
存储引擎就是 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的压力
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果