从并发和索引说说innodb和myisam的区别
一.引言
这个问题看似是个很俗气的问题,但是在面试中也是个经常被问到的问题。我想很多人都能说出几条,比如事物,外键,等等。但是我想这样想起一点说一句这么回答的话,知识其实都是分散的,这样就显得不是很高大上。
我认为回答这个问题,可以从两个方面来阐述,一个是并发控制方面,还有一个就是索引实现方面。
二.并发控制
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的区别的更多相关文章
- InnoDB和MyISAM的区别与选择
MyISAM 性能(适合小项目,读快速)MyISAM 是MySQL中默认的存储引擎,比如适合新闻系统,读为主.InnoDB 事务或外键支持(适合大项目,高并发读写)活跃用户20多万时候,也能很轻松应付 ...
- MySQL之innodb和myisam的区别
innodb和myisam的区别: MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型, .frm文件存储表定义, 数据文件的扩展名为.MYD, 索引文件的扩展名是 ...
- 为什么要使用索引?-Innodb与Myisam引擎的区别与应用场景
Innodb与Myisam引擎的区别与应用场景 http://www.cnblogs.com/changna1314/p/6878900.html https://www.cnblogs.com/ho ...
- InnoDB与MyISAM的区别
MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处 ...
- sql中InnoDB和MyISAM的区别
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型 1,MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持等高级处理,往往被认为只适合小项目:而 ...
- (转)InnoDB与MyISAM引擎区别
MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比 2015年06月25日 21:58:42 阅读数:1827更多 个人分类: mysql 1.MyISAM:默认表类型,它是基于传统 ...
- InnoDB 与 MYISAM的区别和联系
1.存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...
- mysql中innodb和myisam的区别
InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了 1.事务和外键 InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版 ...
- MySQL存储引擎 InnoDB与MyISAM的区别
来源:http://www.jb51.net/article/47597.htm 基本的差别:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行 ...
随机推荐
- PIE SDK Command、Tool、Control的调用和拓展
1.功能简介 在一个项目中,是通过小组成员共同开发的,难以避免的是当项目功能集成的时候会出现很多兼容性问题,开发讲究高内聚低耦合,利用Command.Tool和Control的使用,可以提升集成的效率 ...
- unity5.5 5.6 使用c#6.0或7.0
http://blog.csdn.net/davied9/article/details/77281393
- 在lua中解决if else switch问题
之前写过一个c#版本的使用字典去解决switch问题 http://www.cnblogs.com/sanyejun/p/7806210.html 现在用写lua版本的 function Main( ...
- JSON转C#实体类
https://www.bejson.com/convert/json2csharp/
- js 用简单案例举模态对话框弹出
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- swpuctf-web部分学习总结
1.用优惠码 买个 X ? (1)第一步: 这道题第一步主要知道利用php的随机种子数泄露以后就可以利用该种子数来预测序列,而在题目中会返回15位的优惠码,但是必须要24位的优惠码,因此要根据15位的 ...
- C++程序设计基础(1)程序的编译和执行
注:读<程序员面试笔记>笔记总结 1.编译执行过程 1.1预处理: (1)所有以#开头的代码都属于预处理的范畴:#include,#define,#ifdef(#ifndef,#endif ...
- SQLite 大小写敏感
--转自mojianpo http://mojianpo.iteye.com/blog/1496579 大部分数据库在进行字符串比较的时候,对大小写是不敏感的. 但是,在SQLite中,对大小写是敏 ...
- 【学习笔记】关于DOM4J:使用DOM4J解析XML文档
一.概述 DOM4J是一个易用的.开源的库,用于XML.XPath和XSLT中.采用了Java集合框架并完全支持DOM.SAX.和JAXP. DOM4J最大的特色是使用大量的接口,主要接口都在org. ...
- PAT 1036 Boys vs Girls
#include <cstdio> #include <iostream> #include <cstdlib> #include <algorithm> ...