一、区别

1、MySQL默认采用的是MyISAM。

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

3、InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即 MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以 MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。

4、InnoDB的主键范围更大,最大是MyISAM的2倍。

5、InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、 varchar和text中的每个词(停用词除外)建立倒排序索引。

6、没有where的count(*)使用MyISAM要比InnoDB快得多。因 为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般 要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。

二、InnoDB引擎的行锁是通过加在什么上完成(或称实现)的?为什么是这样子的?

  答:InnoDB是基于索引来完成行锁
  例: select * from tab_with_index where id = 1 for update;
  for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列,  如果 id 不是索引键那么InnoDB将完成表锁,,并发将无从谈起

三、问了innodb的事务与日志的实现方式
(1)、有多少种日志;
  错误日志:记录出错信息,也记录一些警告信息或者正确的信息。
  查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。
  慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。
  二进制日志:记录对数据库执行更改的所有操作。
  中继日志:
  事务日志:
(2)、事物的4种隔离级别及并发带来的问题

  未提交读(READUNCOMMITTED)。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)。

  提交读(READCOMMITTED)。本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)。

  可重复读(REPEATABLEREAD)。在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象(稍后解释)。

  串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥。

四个级别逐渐增强,每个级别解决一个问题。

  脏读,最容易理解。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据。

  不重复读。解决了脏读后,会遇到,同一个事务执行过程中,另外一个事务提交了新数据,因此本事务先后两次读到的数据结果会不一致。

  幻读。解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。

(3)、事务是如何通过日志来实现的。
  事务日志是通过redo和innodb的存储引擎日志缓冲(Innodb log buffer)来实现的,当开始一个事务的时候,会记录该事务的lsn(log sequence number)号; 当事务执行时,会往InnoDB存储引擎的日志的日志缓存里面插入事务日志;当事务提交时,必须将存储引擎的日志缓冲写入磁盘(通过innodb_flush_log_at_trx_commit来控制),也就是写数据前,需要先写日志。这种方式称为“预写日志方式”。

最新文章

  1. 50款强力jquey,js 插件推荐
  2. 第六篇:python高级之网络编程
  3. 用java写bp神经网络(三)
  4. Struts2(二)——配置文件struts2.xml的编写
  5. 自制基于HMM的中文分词器
  6. tensorflow-RNN和LSTM
  7. @RefreshScope 配置方法
  8. yolo_v3训练自己的模型(人脸及deep-sort)
  9. gym-101350D
  10. python --端点调试
  11. 为什么要使用NoSQL
  12. js调用打印机打印
  13. WordCount改进 小组项目
  14. Android从无知到有知——NO.3
  15. 开启session
  16. YACC、LEX、JAVACC-------常用的编译工具
  17. [LeetCode题解]: Sort Colors
  18. UEditor代码实现高亮显示
  19. [UOJ300]吉夫特
  20. EasyGBS国标流媒体视频平台接入海康、大华、宇视的摄像机、硬盘录像机NVR、国标下级平台的方案

热门文章

  1. 小程序 ----踩坑 ---安卓iOS兼容等
  2. 逗渣的学习笔记-关于webpack从头撸一遍
  3. Java秒杀实战 (三)秒杀基本功能开发
  4. You are using the runtime-only build of Vue where the template compiler is not available.
  5. 3.web开发入门知识
  6. 3. caffe中 python Notebook
  7. 数据库底层索引为什么用B树
  8. 回顾了下shell 编程的一些细节
  9. DAG及拓扑排序
  10. Java实现一行一行读取文件内容(进行编码处理)