1、InnoDB支持事务,MyISAM不支持,也就是说MyISAM不支持事务回滚操作,这个功能可能是致命的

2、InnoDB支持行锁,MyISAM只支持表锁,不过InnoDB的行锁是建立在索引之上的,也就是说如果索引未命中,那么此次操作还是会降级到表锁。如uid为索引

update t_user set age=10 where uid=1;             命中索引,行锁。

update t_user set age=10 where uid != 1;           未命中索引,表锁。

3、InnoDB表是基于聚簇索引建立的,采用B+树,MyISAM是基于非聚簇索引,索引数据结构也是B+树

  聚簇索引:它并不是一种单独的索引类型,而是一种数据存储方式。聚簇索引是依托主键而建立的,这种存储方式将索引值与数据行全部存储到同一个结构中。

如果没有主键,InnoDB会选择一个唯一的非空索引代替,如果没有符合条件的索引,InnoDB会隐式的创建一个主键来作为聚簇索引。InnoDB中,其非聚簇索引,又叫辅助索引或者二级索引,他们是将数据行地址这里更正一下,二级索引中存放的并不是指向行的指针,而是行的主键值!)存到B+树的叶子结点中,也就是说,想通过二级索引查找行数据,存储引擎需要先找到二级索引的叶子结点对应的主键值,然后根据这个值去聚簇索引中查找到相应的数据行。这里做了重复的工作,因此至少做两次B+tree查找(至少,是因为可能有的数据更新后无法存储在原来的位置,这会导致表中出现行的碎片化或者在原位置留下一个指向新位置的指针,因此一次非聚簇索引未必能找到目的主键值)。对于InnoDB来说,自适应哈希索引能够减少这样的重复工作。

因此,聚簇索引对于IO密集型的系统来说至关重要,可以大大提高其性能。但如果系统将数据全部存放在内存中,聚簇索引便没什么优势了。但是,聚簇索引也有一定的弊端,比如更新局促索引列的代价太高,整行数据都得跟着索引移到新的位置,还有页分裂问题等。

对于MyISAM存储引擎,包含以下三种格式的文件:

.frm      是描述表结构的文件  
.MYD   是表的数据文件  
.MYI     是表数据文件中任何索引的数据树

对于InnoDB,索引和数据都在同一个文件内,.IDB

4、InnoDB是不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快

5、InnoDB版本5.7之后才开始支持全文索引,而MyISAM一直支持全文索引

6、MyISAM是支持压缩的,压缩后的表传输、查询速率都大大提高,不过压缩状态下的表是不可以修改的,只有解压后才可修改

7、InnoDB支持外键而MyISAM不支持,也就是说,如果将一个表由InnoDB转成MyISAM然后再转回来,外键会消失

8、InnoDB表必须有主键(用户没有指定的话会自己找或生成一个隐式主键),而Myisam可以没有


那么二者如何选择呢?

  • 如果需要事务和事务回滚,InnoDB!
  • 如果读远多于写,MyISAM!
  • 如果你还是没主意,那就InnoDB吧,毕竟它是目前主推(默认)的内存引擎

最后,这里提一下InnoDB引擎的四大特性(想要深入研究的同学可以看这位博主的链接):插入缓冲(insert buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead)

InnoDB与MyISAM的区别(高性能MySQL笔记)的更多相关文章

  1. MySQL之innodb和myisam的区别

    innodb和myisam的区别: MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型, .frm文件存储表定义, 数据文件的扩展名为.MYD, 索引文件的扩展名是 ...

  2. InnoDB和MyISAM的区别与选择

    MyISAM 性能(适合小项目,读快速)MyISAM 是MySQL中默认的存储引擎,比如适合新闻系统,读为主.InnoDB 事务或外键支持(适合大项目,高并发读写)活跃用户20多万时候,也能很轻松应付 ...

  3. MySql的多存储引擎架构, 默认的引擎InnoDB与 MYISAM的区别(滴滴)

    1.存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...

  4. MySQL存储引擎——InnoDB和MyISAM的区别

    MySQL5.5后,默认存储引擎是InnoDB,5.5之前默认是MyISAM. InnoDB(事务性数据库引擎)和MyISAM的区别补充: InnoDB是聚集索引,数据结构是B+树,叶子节点存K-V, ...

  5. MySQL存储引擎InnoDB与MyISAM的区别

    一.比较 事务:InnoDB是事务型的,可以使用Commit和Rollback语句. 并发:MyISAM只支持表级锁,InnoDB还支持行级锁. 外键:InnoDB支持外键. 备份:InnoDB支持在 ...

  6. mysql中innodb和myisam的区别

    InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了 1.事务和外键 InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版 ...

  7. MySQL存储引擎 InnoDB与MyISAM的区别

    来源:http://www.jb51.net/article/47597.htm 基本的差别:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行 ...

  8. mysql 存储引擎 InnoDB 与 MyISAM 的区别和选择

    http://www.blogjava.net/jiangshachina/archive/2009/05/31/279288.html     酷壳 - MySQL: InnoDB 还是 MyISA ...

  9. InnoDB 与 MYISAM的区别和联系

    1.存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...

  10. InnoDB与MyISAM的区别

    MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处 ...

随机推荐

  1. 全面解读Python Web开发框架Django,利用Django构建web应用及其部署

    全面解读Python Web开发框架Django Django是一个开源的Web应用框架,由Python写成.采用MVC的软件设计模式,主要目标是使得开发复杂的.数据库驱动的网站变得简单.Django ...

  2. 2015年NOIP普及组复赛题解

    题目涉及算法: 金币:入门题: 扫雷游戏:入门题: 求和:简单数学推导: 推销员:贪心. 金币 题目链接:https://www.luogu.org/problem/P2669 入门题,直接开一个循环 ...

  3. Editplus配置java编译运行环境

    1.进入配置环境界面 首先,从菜单"工具(Tools)"->"配置用户工具..."进入用户工具设置. 在类别里展开"工具"树形菜单-& ...

  4. centos linux mysql 10060远程错误代码

    Navicat for MySQL远程连接数据错误代码10060 1.登陆远程linux服务器命令界面 vim /etc/sysconfig/iptables  进入防火墙配置修改 增加以下两条防火墙 ...

  5. 备战省赛组队训练赛第十六场(UPC)

    传送门 题解: by 烟台大学 (提取码:8972)

  6. 组合数学入门—TwelveFold Way

    组合数学入门-TwelveFold Way 你需要解决\(12\)个组合计数问题. \(n\)个有标号/无标号的球分给\(m\)个有标号/无标号的盒子 盒子有三种限制: A.无限制 B.每个盒子至少有 ...

  7. jQuery 工具类函数-检测对象是否为原始对象

    调用名为$.isPlainObject的工具函数,能检测对象是否为通过{}或new Object()关键字创建的原始对象,如果是,返回true,否则,返回false值,调用格式为: $.isPlain ...

  8. vue-learning:17- js - methods

    methods 函数是十分优雅的语言特性,它让我们可以采用可复用的方式存储一段逻辑,从而不用重复代码就可以在多处调用.函数.组件.模块等都有复用代码的考虑,函数应该是最早组织复用代码的实现. 在vue ...

  9. hive查询中文乱码问题

    问题1. hue中中文字符乱码问题,重现步骤如下 create external table test_1_txt (id int, name varchar(100))  location '/tm ...

  10. Java中的Redis 哨兵高可用性

    让我们探索Redis Sentinel,看看如何在Java上运行它,一起来看看,最近get了很多新知识,分享给大家参考学习.需要详细的java架构思维导图路线也可以评论获取! 什么是Redis哨兵? ...