一.InnoDB和MylSAM存储引擎对比

  • MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transaction)。不过,在这几年的发展下,MySQL也导入了InnoDB(另一种数据库引擎),以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM。
  • InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。
  • MyISAM和InnoDB两者之间有着明显区别:
    • a.事务支持:MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交;MyISAM是非事务安全型的,而InnoDB是事务安全型的,默认开启自动提交,宜合并事务,一同提交,减小数据库多次提交导致的开销,大大提高性能。
    • b.存储结构:MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex);InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。
    • c.存储空间:MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表;InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
    • d.可移植性、备份及恢复:MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作;InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用mysqldump,在数据量达到几十G的时候就相对痛苦了。
    • e.事务支持:MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持;InnoDB:提供事务支持事务,外部键等高级数据库功能。具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
    • f.AUTO_INCREMENT:MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增;InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。
    • g.表锁差异:MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据;InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。MyISAM锁的粒度是表级,而InnoDB支持行级锁定。简单来说就是, InnoDB支持数据行锁定,而MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。
    • h.全文索引:MyISAM:支持(FULLTEXT类型的)全文索引;InnoDB:不支持(FULLTEXT类型的)全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。另外,MyIsam索引和数据分离,InnoDB在一起,MyIsam天生非聚簇索引,最多有一个unique的性质,InnoDB的数据文件本身就是主键索引文件,这样的索引被称为“聚簇索引”。
    • i.表主键:MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址;InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。InnoDB的主键范围更大,最大是MyISAM的2倍。
    • j.表的具体行数:MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出出该值;InnoDB:没有保存表的总行数(只能遍历),如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了where条件后,myisam和innodb处理的方式都一样。
    • k.CURD操作:MyISAM:如果执行大量的SELECT,MyISAM是更好的选择;InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。
    • l.外键:MyISAM:不支持;InnoDB:支持
    • m.查询效率:没有where的count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
  • 总结:通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

二.MyISAM和InnoDB两者的应用场景

  • a.MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
  • b.InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

博客原文

  • 参考博客

MySQL数据库中的MyISAM和InnoDB存储引擎对比相关推荐

  1. mysql数据库永久设置手动提交事务(InnoDB存储引擎禁止autocommit默认开启)

    mysql数据库InnoDB存储引擎(默认情况下是自动控制提交事务)与其他关系型数据库在默认事务处理与其他关系型数据库略有不同,之前已经习惯Oracle数据库的手动提交事务的处理方式,mysql数据库 ...

  2. MySQL的MyISAM和InnoDB存储引擎表结构

    MySQL的MyISAM和InnoDB存储引擎表结构: MyISAM存储引擎: MyISAM表:每一个表都有3个文件,都位于数据库目录中. tb_name.frm 表结构定义 tb_name.MYD ...

  3. MyISAM和InnoDB存储引擎的特点

    Mysql区别于其他数据库的一个重要特点是其插件式的表存储引擎,注意,存储引擎是基于表的,而不是基于数据库. MyISAM 特性 不支持事务:MyISAM存储引擎不支持事务,所以对事务有要求的业务场景 ...

  4. innodb和my查询速度_吃透MySQL:MyISAM和InnoDB存储引擎详细介绍

    一,MySQL基本架构 MySQL基础架构可以分为两大类:Server层和存储引擎层. Server层: Server层涵盖了MySQL大部分核心业务功能,并且所有存储引擎的功能都在这一层实现. 存储 ...

  5. mysql数据库应用模式与特点_MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述...

    MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...

  6. 3种mysql的储存机制_MySQL三种InnoDB、MyISAM和MEMORY存储引擎对比

    三种引擎的区别: 事务:InnoDB支持事务,MyISAM和MEMORY两个不支持. 存储限制:InnoDB有64TB的存储限制,MyISAM和MEMORY要跟具体情况而定. 空间使用:InnoDB对 ...

  7. MySQL数据库的索引、事务和存储引擎

    目录 一.索引 1.1 索引的概念 1.2 索引的作用 1.3 创建索引的原则 1.4 索引的分类 1.5 索引的创建 1.5.1 普通索引 1.5.2 唯一索引 1.5.3 主键索引 1.5.4 组 ...

  8. MyISAM与InnoDB存储引擎

    MyISAM存储引擎 MyISAM索引文件和数据文件是分离的(非聚集) CREATE TABLE `test_myisam` (`clo1` int(11) NOT NULL AUTO_INCREME ...

  9. MySQL技术内幕(一) InnoDB存储引擎

    文章目录 1. InnoDB 体系架构 1.1 后台线程 1.2 内存 1.3 Checkpoint 技术 1.5 Master Thread 工作方式 1.6 InnoDB 关键特性 1.6.1 插 ...

最新文章

  1. IP地址的三种表示格式及在Socket编程中的应用
  2. 看屁股,你是一头大象吧
  3. 基于docker部署的微服务架构(四): 配置中心
  4. 【剑指offer】设置在最小数目的阵列
  5. C/Cpp / 设计模式 / 单例模式(线程安全)
  6. step 1 android-sdk-download
  7. 数据值、列类型和数据字段属性
  8. 微型计算机系统中 麦克风属于,模块1-2 计算机基础知识测验题目(50小题)
  9. 【原创】修复ios输入框获取焦点时不支持fixed的bug
  10. oracle8i数据库修复,用ORACLE8i修复数据库坏块的三种方法
  11. 如何利用caffe自带的工具包绘制accuracy/loss曲线
  12. 难怪这个文章评论多,原来被推荐了
  13. 关于一些初级ACM竞赛题目的分析和题解(一)。
  14. 低成本DIY:4G/5G网络遥控无人机-无人车-图传/数传/遥控一体!
  15. 应用程序无法正常启动0xc000007b win7
  16. 使用8080并口协议驱动NT35510LCD显示屏
  17. 一次zookeeper启动失败的解决过程
  18. SpringCloud Admin监控界面解释
  19. FreeMarker的基础操作
  20. R语言爬虫豆瓣高评分电影(喝最烈的酒,熬最深的夜,吃最好的胃药,敷最贵的面膜)

热门文章

  1. thinkphp5.1嵌套关联预载入的写法
  2. Webpack 最佳实践总结(一)
  3. php5.6.11编译安装报错configure: error: Don't know how to define struct flock on this system
  4. 构建Docker镜像(三)
  5. JavaScript停止冒泡和阻止浏览器默认行为
  6. 深入浅出Docker(一):Docker核心技术预览
  7. 利用stdin stdout stderr及POSIX-linux机制重定向写日志
  8. linux高级数据存储
  9. HDu1241 DFS搜索
  10. 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)...