一.引言

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

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

二.并发控制

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. Ubuntu 15.04 下apt-get安装JDK

    [From] http://blog.csdn.net/skykingf/article/details/45250017 1.删除自带的OpenJDK [python] view plain cop ...

  2. datetime和date如何转json

    import json from datetime import datetime, date class MyJson(json.JSONEncoder): def default(self, o) ...

  3. python 十大经典排序算法

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...

  4. Gradle发布项目到 maven(1)

    常见的 Maven 仓库 JCenter.MavenCenter.JitPack epositories { google() // google 仓库 jcenter() // JCenter 仓库 ...

  5. 4~20mA转0~5V

    RCV420是一种精密的I/V转换电路,也是目前最佳的4-20mA转换0-5V的电路方案,有商用级(0℃-70℃)和工业级(-25℃-+85℃)供你选购 301欧姆为精度1%. RCV420运行40m ...

  6. storm中几个概念的大小关系

    从图可以看出来:topology>supervisor>worker>excutor>task; 也就是说一个topology可以运行在多个supervisor上,一个supe ...

  7. Mysql中各种与字符编码集(character_set)有关的变量含义

    mysql涉及到各种字符集,在此做一个总结. 字符集的设置是通过环境变量来设置的,环境变量和linux中的环境变量是一个意思.mysql的环境变量分为两种:session和global.session ...

  8. nyoj 546——Divideing Jewels——————【dp、多重背包板子题】

    Divideing Jewels 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 Mary and Rose own a collection of jewells. ...

  9. smarty中函数的使用以及二维数组的使用

    1.虽然讲究前后台分离,但是如果如果有的项目,前后台分离的不彻底,或者有些必须要在HTML中处理,还是要用到PHP中的函数的: <% if $Role|in_array:$menuRole[$c ...

  10. HTML 5中的新特性

    HTML 5中的新特性 html5新增了一些语义化更好的标签元素.首先,让我们来了解一下HTML语义化. 1.什么是HTML语义化? 根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开 ...