一.引言

这个问题看似是个很俗气的问题,但是在面试中也是个经常被问到的问题。我想很多人都能说出几条,比如事物,外键,等等。但是我想这样想起一点说一句这么回答的话,知识其实都是分散的,这样就显得不是很高大上

我认为回答这个问题,可以从两个方面来阐述,一个是并发控制方面,还有一个就是索引实现方面。

二.并发控制

1.myisam是表级锁

表锁的意思就是,对整张表加锁,当用户进行写操作(UPDATE INSEART DELETE)时,用户获得一个写锁,写锁会禁止任何用户的读/写操作。

举个通俗点的例子来所,比如当一个程序在修改id=1的记录时,这时候任何试图读/写任何记录都会被阻塞。有些人肯定觉得这样很不科学,只是更新id=1的记录,凭什么我想读id=2的记录或者修改id=3的记录等等全都要等待啊。

很明显表锁的并发很低,但是表锁的管理开销是最低的,也是最简单的。就好像不是有了快排,其他排序就全没用武之地了。

2.innodb是支持MVCC(多版本并发控制)的行级锁

这个MVCC比较复杂,估计面试时候别人也不会深究,我觉得只需要知道行级锁解决了上面表级锁的那种情况,提高了并发,随之锁的系统开销也变大了。

三.索引实现

1.myisam和innodb的索引实现都是基于B+TREE

这两种存储引擎都是通过primary key(id)或者index(col1,col2...)的方式来添加索引的,在内部实现上这两种索引分别叫做主键索引和辅助索引,而这4种(2种引擎*2种索引)索引都是基于B+TREE的。B+TREE简单的来说就是二叉查找树的升级版,只不过他是有N个分裂,并且平衡的,所有数据都在叶子节点上,并且叶子节点都指向兄弟的指针。所以无论是那种引擎,当我们对比如col1建索引的时候,一定都是只有左匹配才能用到索引,因为B+TREE是按照col1的开始排序的,这样就解释了为什么like '%col1'无法用到索引。当我们队比如col1,col2建索引的时候,如果where col2=xx and col1=oo是用不到索引的,因为B+TREE是按照先对col1排序,再对col2排序存储索引的。

2.myisam是非聚集索引

非聚集索引指的是,在B+TREE中叶子节点数据除了有索引数据,剩下的是存储物理行的地址。对于myisam而言,主键索引和辅助索引实现上几乎没什么区别。因为索引到的数据是指向物理行的地址,所以想取到数据的话,必须再根据物理行地址去读一次数据文件。

3.innodb是主键索引是聚集索引

所谓的聚集索引指的是,在B+TREE中的叶子节点数据包含了记录中的全部数据。辅助索引中和myisam不同的是,辅助索引除了索引值包含的是该行的主键值,也有人把myisam存储的叫物理地址,而innodb中存储的叫逻辑地址。这样设计以后,对于按照主键检索,可以只读索引文件,就能取到任何数据,减少了一次IO,但是对于辅助索引的使用,除了通过B+TREE检索到数据还要再次通过主键索引的B+TREE定位到具体的数据,相当于做了两次检索。

四.总结

总的来说,如果myisam是比innodb更简单的存储引擎,从并发的角度看,如果写不频繁的应用适合用myisam,需要事物支持的肯定用inonodb。

从索引的使用上看,innodb对于主键的单调有序性要求很高,因为任何索引最终都需要通过主键索引来定位数据。

还有一些小区别,比如myisam存储引擎中保存了行数的值。

持续更新中....

从并发和索引说说innodb和myisam的区别的更多相关文章

  1. InnoDB和MyISAM的区别与选择

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

  2. MySQL之innodb和myisam的区别

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

  3. 为什么要使用索引?-Innodb与Myisam引擎的区别与应用场景

    Innodb与Myisam引擎的区别与应用场景 http://www.cnblogs.com/changna1314/p/6878900.html https://www.cnblogs.com/ho ...

  4. InnoDB与MyISAM的区别

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

  5. sql中InnoDB和MyISAM的区别

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型 1,MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持等高级处理,往往被认为只适合小项目:而 ...

  6. (转)InnoDB与MyISAM引擎区别

    MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比 2015年06月25日 21:58:42 阅读数:1827更多 个人分类: mysql   1.MyISAM:默认表类型,它是基于传统 ...

  7. InnoDB 与 MYISAM的区别和联系

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

  8. mysql中innodb和myisam的区别

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

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

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

随机推荐

  1. 【网络】EIGRP负载均衡、手工汇总、泄露明细、安全认证

    基于6.6.6.6/24访问13.1.1.1/24进行负载均衡实例图 一.等价负载均衡 等价负载均衡前,R5路由器背后的6.6.6.6/24访问R1的13.1.1.1/24, 从15.1.1.0/24 ...

  2. 日志logback

    http://tengj.top/2017/04/05/springboot7/ ------------------ logback使用指南. 公司配置 <?xml version=" ...

  3. ztree框架使用问题汇总

    1.如何让用户只能点击页子节点 var setting = { callback: { beforeClick: zTreeBeforeClick } }; function zTreeBeforeC ...

  4. Unity游戏项目常见性能问题

    Unity技术支持团队经常会对有需求的客户公司项目进行游戏项目性能审查与优化,在我们碰到过的各种项目相关的问题中也有很多比较共同的方面,这里我们罗列了一些常见的问题并进行了归类,开发者朋友们可以参考下 ...

  5. DIV水平垂直居中的CSS兼容写法

    DIV水平垂直居中,非IE浏览器可以用CSS3来处理,IE浏览器中分别处理IE6和/IE7.IE8.IE9. 在IE低版本中,虽然大致上没有问题,但还是有一些细微的显示问题. 示例如下: <!D ...

  6. jquery点滴总结

    1.empty().remove().detach() empty():只移除了 指定元素中的所有子节点,而留下 了<p></p>,仍保留其在dom中所占的位置. remove ...

  7. css三角块

    html: <div class="angle"></div> css: .angle{ width: 0px; height: 0px; border-b ...

  8. 将代码托管到github,并生成链接访问

    转眼间加入github的阵营已经两年多了,看到别人建立的个人博客挺好看的,因此,自己从此喜欢上了github,总结下自己的相关知识. 推荐学习Git的网址: 猴子都能懂的GIT入门 http://ba ...

  9. String方法使用示例

    import java.lang.String; public class StringMethodDemo1{ /** 熟悉String的常用方法. */ public static void ma ...

  10. TopcoderSRM679 Div1 250 FiringEmployees(树形dp)

    题意 [题目链接]这怎么发链接啊..... 有一个 \(n\) 个点的树,每个点有点权(点权可能为负) ,求包含点\(1\)的最 大权连通子图(的权值和) . \(n \leqslant 2500\) ...