一,InnoDB与MyISAM的对比:
|
InnoDB |
MyISAM |
事务上 |
InnoDB提供事务支持,是MySQL默认的事务型存储引擎, 支持事务安全表(ACID), 只要在需要InnoDB不支持的特性时,才考虑是否使用其他的存储引擎 |
MyISAM不支持事务, |
锁机制 |
innoDB支持行锁和外键,并采用MVCC来支持高并发,并且实现4个标准的隔离级别,默认级别是REPEATABLE READ,并且通过间隙锁(next-key locking)防止幻读的出现,间隙锁不仅仅锁定查询中所涉及的行,还会对索引中的间隙进行锁定,防止幻影行的插入; |
MyISAM不支持行级锁,支持表级加锁,读取时会对需要读到的所有表加共享锁,即读锁,写入时会对所有表加排它锁,即写锁(但在表有读取查询的同时,也可以往表中插入新的记录,这被称为并发插入) |
INSERT,DELETE,UODATE,SELECT |
频繁修改或是设计到安全性较高的操作时首选InnoDB |
当执行大量的查询操作时,使用MyISAM性能会比较高 |
2. InnoDB与MyISAM的区别:
(1)InnoDB支持事务,MyISAM不支持事务,当涉及到安全性的操作时,首选InnoDB
(2)MyISAM适合查询插入为主的操作,并且执行大量查询的操作时,性能比较高,InnoDB适合频繁修改以及设计到安全性较高的操作;
(3)InnoDB支持外键和行锁(并采用间隙锁防止幻读, 某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'--在where条件没有使用主键时,照样会锁全表),MySIAM不支持外键,支持表锁(读取时对所有表加共享锁,写入时对所有表加排它锁);
(4)清空整个表时,InnoDB是一行一行的删除,效率非常慢,MyISAM则会重建表;
3.InnoDB与MySIA存储引擎的选择
(1)如果一定要使用事务,就需要选择InnoDB
(2)如果对查询性能要求较高,可以使用MySIAM
二,MySQL事务篇
- 事务的四个特性;
(1),原子性:整个事务中的所有操作,要么全部成功执行,要么全部不完成,然后回滚,不可能停留在中间环节
(2)一致性:数据库在执行前后都保持一致性状态,数据库的完整性约束没有被破坏;
(3)隔离性:数据库中的事务之间的操作是不可见的,互不影响的
(4)持久性:数据库的事务一旦提交,改变将会是永久的,即使数据库系统崩溃,执行结果也不会发生改变,可以通过数据库备份和恢复来保持数据库的持久性
2.MySQL的事务隔离级别;
(1)Read Uncommitted:一个事务读到了另一个事务未提交的数据.(在该隔离级别会出现脏读)
(2)Read Commited:一个事务要等另一个事务提交之后才能读取到数据(在该隔离级别会出现不可重复读)
(3)Repeatable Read:在开始读取事务时,不在允许修改操作(在该隔离基本可能会出现幻读)
(4)Serializable:事务串行化顺序执行,可以避免脏读,不可重复读,幻读,但在该事务隔离级别下,效率较低,比较消耗数据库性能;
3,数据库隔离级别与脏读,不可重复读,幻读的关系;
隔离级别 |
脏读 |
不可重复读 |
幻读 |
Serializable |
否 |
否 |
否 |
Repeatable Read |
否 |
否 |
是 |
Read Commited |
否 |
是 |
是 |
Read Uncommitted |
是 |
是 |
是 |
- 脏读: 某个事务读取的数据是另一个事务正在处理的数据。而另一个事务可能会回滚,造成第一个事务读取的数据是错误的。
- 不可重复读: 在一个事务里两次读入数据,但另一个事务已经更改了第一个事务涉及到的数据,造成第一个事务读入旧数据。
- 幻读: 幻读是指当事务不是独立执行时发生的一种现象。例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。