一.引言

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

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

二.并发控制

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. Django settings配置文件

    由来:为什么我在用django配置的时候导入的不是我项目名下的那个settings 但是我配置了之后依然能够起作用,这是为什么? from django.conf import settings # ...

  2. 2019.3.28 JDBC相关

    JDBC(Java Data Base Connectivity) JDBC是一组用Java编写的类和接口 使用JDBC的好处: 1.Java的开发人员完全不需要关心数据库的连接方式和实现手段 2.提 ...

  3. request-statistics.lua

    --[[ 实现请求统计,并且将单位时间内异常次数达到阀值的请求加入到黑名单中 --]] --获取共享内存 local limit_req_store = ngx.shared.limit_req_st ...

  4. GoLang爬取花瓣网美女图片

    由于之前一直想爬取花瓣网(http://huaban.com/partner/uc/aimeinv/pins/) 的图片,又迫于没时间,所以拖了很久. 鉴于最近在学go语言,就刚好用这个练手了. 预览 ...

  5. Linux下MySQL数据库主从同步配置

    说明: 操作系统:CentOS 5.x 64位 MySQL数据库版本:mysql-5.5.35 MySQL主服务器:192.168.21.128 MySQL从服务器:192.168.21.129 准备 ...

  6. 深入redis内部之redis启动过程之一

    redis作为一个服务器,它的启动是从main函数开始的.redis.c 1. 进程重命名 #ifdef INIT_SETPROCTITLE_REPLACEMENT spt_init(argc, ar ...

  7. Android开发_如何调用系统默认浏览器访问

    Android开发_如何调用系统默认浏览器访问 2015-10-20 17:53 312人阅读  http://blog.sina.com.cn/s/blog_6efce07e010142w7.htm ...

  8. Shader学习笔记

    Shader学习笔记 例子: Shader "SrfShader1"{ //定义显示在Inspector中的变量,并从Inspector中获取值 Properties{ _Colo ...

  9. 深入理解JavaScript系列(29):设计模式之装饰者模式

    介绍 装饰者提供比继承更有弹性的替代方案. 装饰者用用于包装同接口的对象,不仅允许你向方法添加行为,而且还可以将方法设置成原始对象调用(例如装饰者的构造函数). 装饰者用于通过重载方法的形式添加新功能 ...

  10. node.js发邮件

    在node上使用第三方类库(nodemailer)发邮件是一件很esay的事情:) app.js   以QQ邮箱为例 var nodemailer = require('nodemailer'); v ...