一.引言

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

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

二.并发控制

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. CSS 单行 多行文本溢出显示省略号

    单行文本 overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 多行文本溢出显示省略号: <style type=&quo ...

  2. proxyee down源码分析

    proxyee down下载速度不错, 底层使用netty+多线程,最近在看netty网络方面的应用,正好这是个案例 源代码地址 https://github.com/proxyee-down-org ...

  3. java中的集合:继承关系和简介

    1.继承关系图 2.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collect ...

  4. Docker容器日志查看与清理(亲测有效)

    https://blog.csdn.net/yjk13703623757/article/details/80283729 1. 问题 docker容器日志导致主机磁盘空间满了.docker logs ...

  5. zookeeper在windows下的伪集群模式

    参考:zookeeper在windows下的伪集群模式 踩到的坑: 注意windows下路径需要使用\ dataDir=D:\Program Files\Java\zookeeper-3.4.10-c ...

  6. 【ExtJS】关于自定义组件

    一.命名规范 在你编码过程中对类,名字空间以及文件名使用统一的命名规则对你代码的组织,结构化以及可读性有很大的好处. 1.类命名规范: 类名最好只包含字母,在多数情况下,数字是不鼓励使用的,除非非要用 ...

  7. Java网站开发的一些问题以及解决(cookie消失,上传头像,js等)

    1.首先是cookie的问题,很多人都是遇到了将数据存储到cookie中并且add到response之中,但是还有返回其他页面或者刷新页面cookie消失的情况,除了设置cookie的存活时间外, 还 ...

  8. SVM之Python实现

    SVM Python实现 Python实现SVM的理论知识 SVM原始最优化问题: \[ min_{w,b,\xi}{1\over{2}}{||w||}^2 + C\sum_{i=1}^m\xi^{( ...

  9. C# 如何提取SaveFileDialog的保存路径?

    public TestOne() { InitializeComponent(); SaveFileDialog();//调用打开SaveFileDialog 保存对话框 } #region 保存对话 ...

  10. js判断下拉框改变状态

    <script> $('#questSort').change(function(){ //此处写状态改变要实现的功能 var s=$('#questSort').children('op ...