最近在学习mysql的优化方面,这里当然逃不开mysql的引擎了,学的时候自己就是分析了一下这两个的优缺点,和什么情况用MyISAM,什么情况用Innodb。昨天接到阿里电话面试,当问道这两个数据库引擎时,我开心的不得了,这两个我分析过的呀。然而面试官听我说了以后,说了句你说MyISAM查询速度比Innodb快,能告诉我为什么吗。听到这,一时语塞,我只知道是这样,至于为什么,天呐,没研究呀。当面试完了以后,自己就开始分析起来了,这里做一下笔记,方便以后自己复习。

首先还是对比一下这两个的区别吧:

再说说一些细节吧:

1.InnoDB不支持FULLTEXT类型的索引。

2.MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。但是

3..对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

5.LOAD   TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

6.InnoDB的行锁并不是绝对的,当索引失效时,会导致行锁变成表锁。至于什么是索引失效,具体内容挺多的,我下一篇会详细写的。

7.InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。

8.InnoDB会出现死锁,而MyISAM不会。为什么呢,Mysql行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,那么Mysql就会锁定这个主键索引,如果sql语句操作的是非主键索引,那么Mysql会先锁定这个非主键索引,再去锁定主键索引。死锁”举例分析:表Test:(ID,STATE,TIME) 主键索引:ID 非主键索引:STATE当执行"UPDATE STATE =1011 WHERE STATE=1000" 语句的时候会锁定STATE索引,由于STATE 是非主键索引,所以Mysql还会去请求锁定ID索引当另一个SQL语句与语句1几乎同时执行时:“UPDATE STATE=1010 WHERE ID=1” 对于语句2 Mysql会先锁定ID索引,由于语句2操作了STATE字段,所以Mysql还会请求锁定STATE索引。这时。彼此锁定着对方需要的索引,又都在等待对方释放锁定。所以出现了"死锁"的情况。

好,接下来看看开始提出的问题,为啥MyISAM比InnoDB查询速度快:

一句话,InnoDB在做查询的时候,要维护的东西比MyISAM多很多

1.InnoDB缓存索引和真实数据,MyISAM只缓存索引,这中间还有缓存数据换进换出的减少。

2.innodb寻址要映射到块,再到行,MYISAM记录的直接是文件的OFFSET(偏移量),定位比INNODB要快

3.INNODB还需要维护MVCC一致;虽然你的场景没有,但他还是需要去检查和维护MVCC (Multi-Version Concurrency Control)多版本并发控制 ,那什么是多MVCC呢,看到一个官方翻译,挺好理解的,我copy下来了:

多版本并发控制(简称MCC或者MVCC),是一种并发控制思想,通常被用于DBMS中去保证并发连接数据库,或者去实现事务内存编程。如果在一个库中,有人读,同时也有人写,很可能读操作会获取到写入一部分的内容,或者不一致的数据片段。有好几种方法可以解决这个问题,都采用并发控制思想。最简单的方法是加锁,让读操作一直等待直到写入结束,但这会导致读写非常慢。MVCC采用另一种思路,访问数据库的每个用户都将看到一个特定时刻的数据库快照。写操作进行的修改,不会被其他用户看到,直至修改完成(在数据库中,直至事务被提交)。一个支持MVCC的数据库更新某一项数据的时候,它不会直接用新数据去覆盖原数据,而是将原数据标记为废弃,并且把新数据写在其他地方,这样就有多版本的数据同时被存储,但是只有一个是最新的。MVCC允许一个读会话开启之后,连接依然可以查看数据,即使它被其他操作修改或者删除。MVCC让数据库避免直接填写内存的空洞,或磁盘的结构(即被标记为脏数据的部分),一般请求系统周期性换出将脏数据删除。对于一个文件类型的数据库来说,系统通过把整个文件写入相似的磁盘区,更新完成后,整个文件被重写的方式来修改磁盘结构,而非一点一点截取或被链接在一个完全不同的磁盘结构。MVCC提供时间一致性读。MVCC下的读事务一般用一个时间戳或者事务ID来决定读取什么样的数据状态,和哪个版本的数据。这避免了为读事务加锁,因为写操作被独立执行在老本本的数据上,而不是通过发起锁或者互斥进程。写影响一个将来版本的数据,而不是读操作正在进行的事务id版。任何数据都一致的,因为写影响下一个事务id。

当面试官问时,该如何回答MVCC:

多版本控制: 指的是一种提高并发的技术。最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。在内部实现中,与Postgres在数据行上实现多版本不同,InnoDB是在undolog中实现的,通过undolog可以找回数据的历史版本。找回的数据历史版本可以提供给用户读(按照隔离级别的定义,有些读请求只能看到比较老的数据版本),也可以在回滚的时候覆盖数据页上的数据。在InnoDB内部中,会记录一个全局的活跃读写事务数组,其主要用来判断事务的可见性。

那如何实现的呢:

在Mysql Innodb中行记录的存储格式,除了最基本的行信息外,还会有一些额外的字段,这里主要介绍和MVCC有关的字段:事务ID(DB_TRX_ID)和回滚指针(DB_ROLL_PTR)。

  • 6字节的事务ID(DB_TRX_ID)字段: 用来标识最近一次对本行记录做修改(insert|update)的事务的标识符, 即最后一次修改(insert|update)本行记录的事务id。
  • 7字节的回滚指针(DB_ROLL_PTR)字段: 指写入回滚段(rollback segment)的 undo log record (撤销日志记录记录)。
    如果一行记录被更新, 则 undo log record 包含 '重建该行记录被更新之前内容' 所必须的信息。()

根据回归指针可找到之前版本的数据,查询的话查询小于等于前事务id最近的一条版本的数据

ReadView中主要就是有个列表来存储我们系统中当前活跃着的读写事务,也就是begin了还未提交的事务。通过这个列表来判断记录的某个版本是否对当前事务可见。

mvcc原理:
先提两个概念:
1.每个表的行记录除了数据字段之外,还有两个重要的字段,那就是事务id和回滚指针。
2.undo log
undo log存储了许多旧的行数据,每一个回滚指针对应一个旧的行数据,当需要回滚的时候,直接拿当前行的回滚指针去undo log拿到旧的行数据,就能够恢复数据了。
这个和mvcc有啥关系呢,当然有关系,当
这个过程解决了回滚数据的问题。再来解决读数据的问题。多个活动的事务如何读到正确的数据?其实就是解决可重复读的问题。
3.事务快照
用来做可读性判断的,在innodb中(默认repeatable read级别), 事务在begin/start transaction之后的第一条select读操作后, 会创建一个快照(read view), 将当前系统中活跃的其他事务记录记录起来;
一个事务快照的创建过程可以概括为:
查看当前所有的未提交并活跃的事务,存储在数组中
选取未提交并活跃的事务中最小的XID,记录在快照的xmin中
选取所有已提交事务中最大的XID,加1后记录在xmax中

其中根据xmin和xmax的定义,事务和快照的可见性可以概括为:

  1. 当事务ID小于xmin的事务表示已经被提交,其涉及的修改对当前快照可见
  2. 事务ID大于或等于xmax的事务表示正在执行,其所做的修改对当前快照不可见
  3. 事务ID处在 [xmin, xmax)区间的事务, 该行记录所在事务在本次新事务创建的时候处于活动状态,从xmax到xmin进行遍历,如果事务ID等于他们之中的某个事务id的话,那么不可见, 调到步骤4,否则表示可见。
  4. 从该行记录的 DB_ROLL_PTR 指针所指向的回滚段中取出最新的undo-log的版本号, 将它赋值该 当前事务id,然后跳到步骤1重新开始判断。

参考:
https://segmentfault.com/a/1190000012650596

参考文章:

http://www.cnblogs.com/wyeat/p/translation_mvcc.html (mvcc)

http://www.cnblogs.com/fwqblogs/p/6645274.html

http://www.2cto.com/database/201404/291438.html

http://blog.csdn.net/xifeijian/article/details/20316775

mysql之MyISAM和InnoDB相关推荐

  1. MySQL中Myisam、InnoDB碎片优化

    起因:查看线上数据库中Table Information时发现有一个日志表数据大小和索引大小有915M,但实际行数只有92行.该表需要频繁插入并且会定时去删掉旧的记录.表类型为Myisam,已建立一个 ...

  2. 【MySQl】MyISAM和InnoDB索引对比

    [MySQl]MyISAM和InnoDB索引对比 部分内容转自:http://www.2cto.com/database/201211/172380.html 比较好的文章:http://www.cn ...

  3. MySQL的MyISAM和InnoDB存储引擎表结构

    MySQL的MyISAM和InnoDB存储引擎表结构: MyISAM存储引擎: MyISAM表:每一个表都有3个文件,都位于数据库目录中. tb_name.frm 表结构定义 tb_name.MYD ...

  4. MySQL中MyISAM 与innoDB的区别(转)

    InnoDB 和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而 InnoDB类型支持.MyISAM类型的表强调 ...

  5. innodb和my查询速度_吃透MySQL:MyISAM和InnoDB存储引擎详细介绍

    一,MySQL基本架构 MySQL基础架构可以分为两大类:Server层和存储引擎层. Server层: Server层涵盖了MySQL大部分核心业务功能,并且所有存储引擎的功能都在这一层实现. 存储 ...

  6. MySQL数据库MyISAM和InnoDB存储引擎的比较

    MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种.这里介绍关于这两种引擎的一些基本概念(非深入介绍). MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索 ...

  7. MySQL的MyISAM和InnoDB对比及优化(转)

    MyISAM和InnoDB是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是 ...

  8. mysql使用混合引擎如何,mysql – 使用MyISAM和InnoDB引擎的数据库的一致逻辑备份...

    我有一个关于MySQL数据库的逻辑备份的问题 同时使用MyISAM和InnoDB. mysqldump实用程序支持以下两个选项: > –single-transaction – 通过转储单个事务 ...

  9. MySQL中myisam和innodb的主键索引有什么区别?

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索 ...

最新文章

  1. R - 0 or 1 HDU - 4370
  2. velocimeter-view android测速仪效果
  3. php 发出get与post请求
  4. MySql的优化步骤
  5. 中国地质大学计算机考研录取名单,中国地质大学考研拟录取名单2021公布在哪里?什么时候公布?...
  6. 并行和并发有什么区别?
  7. js udp通信_nodejs源码分析第十九章 -- udp模块
  8. J2SE核心实战开发—— 集合类框架
  9. jaccard相似度_如何计算两个字符串之间的文本相似度?
  10. Python编程的Turtle 库画出“精美碎花小清新风格树”,速取代码!
  11. 无线打印机 连接路由器连接到服务器,怎么通过无线路由器连到有的打印机线网络...
  12. struts2的struts.properties配置文件详解 (转)
  13. 利用Office公式编辑器特殊处理逻辑的免杀技术分析(CVE-2017-11882)
  14. 泛微 - eteams
  15. CorelDRAW常用工具之橡皮擦工具
  16. 《C语言程序设计》第4版 何钦铭、颜晖主编 课后习题答案 第4章 课后习题
  17. Linux内核调试方法总结
  18. 安装企业宽带的一些问题
  19. Mybatis 实现原理之 一二级缓存
  20. 双重差分模型能做固定效应吗_stata中双重差分操流程及代码

热门文章

  1. 如何让暴风影音播放flv文件
  2. Android软键盘的全面解析,让你不再怕控件被遮盖
  3. 这些大学奖学金覆盖率100%!
  4. 移动端网页禁止下拉刷新css
  5. 【历史上的今天】12 月 7 日:历史上第一次直播回放;唱片协会起诉 Napster;最大的梅森素数被发现
  6. DataList和ListView数据控件的使用
  7. 宏观经济需求与供给分析之:需求的收入效应、替代效应和需求定律
  8. 微擎系统内置的所有函数大全,一共5435个,可以当作微擎开发函数手册来查看(下篇)
  9. 计算机盘无法访问,电脑F盘没法访问,参数不正确?
  10. 基于AT89C51单片机的抢答器的设计(数码管:四位一体共阳)