文章目录
前言一:概述MyISAM和InnoDB二:区别详解(12大区别)区别1:事务支持区别2:表锁差异区别3:读写过程区别4:缓存特性区别5:存储方式区别6:外键支持区别7:全文索引区别8:在磁盘上的存储类型区别9:存储空间区别10:表主键区别11:表的具体行数区别12:读写性能
二:选择存储引擎的依据2.1:生产环境中依据什么选择存储引擎?2.2:什么生产场景适合使用MyISAM?2.3:什么生产场景适合使用InnoDB?
前言
存储引擎就是 MySQL将数据存储在文件系统中的存储方式或者存储格式目前 MySQL常用的两种存储引擎
MyISAMInnoDB
一:概述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的压力