MyISAM 和 InnoDB 的区别

1.适用场景

如非确实有必要,一般都要使用InnoDB存储引擎。

2.锁粒度

MyISAM是表锁,InnoDB是行锁。

当执行事务时,相当于执行了锁,来保持数据的一致性,但是锁分多种,有行锁,表锁。行锁就是只锁定那一行,那一条记录,别的连接下的操作还可以操作这张表。表锁就是锁定整张表,只有当前连接执行完事务,才可以解锁。

3.事务

MyISAM不支持事务,InnoDB支持事务。

事务就是一组原子性的SQL,事务内的语句,要么全部执行成功,要么不执行。
例如:A要给B转账200元,那么A的账户要减少200,B的账户要增加200,这两个操作要在同一个事务中,要么全部执行成功,要么不执行。

4.热备

MyISAM不支持热备,InnoDB支持热备。

5.索引

InnoDB使用聚簇,二级索引中必须包含主键。MyISAM保存指向数据行的指针。

事务的ACID特性:

Atomicity(原子性):一个事务必须被视为一个不可分割的工作单元,事务中的操作要么全部成功,要么全部失败回滚。

Consistency(一致性):数据库总是从一个一致性的状态转换到另外一个一致性的状态。拿之前的转账举例,事务开始之前和事务结束之后,总金额是不变的。

Isolation(隔离性):一个事务所做的修改在最终提交之前,对其他事务不可见。仍然拿之前的转账来举例,事务提交之前,如果有其他的事务查询A的账户余额,那么这是A的账户余额并没有减少200。

Durability(持久性):一旦事务提交,则其所作的修改就会永久的保存到数据库中。即使此时数据库崩溃,修改的数据也不会消失。

事务的隔离级别:

SQL标准定义了四种隔离级别,每一种级别都规定了一个事务中所作的修改,哪些在事务内和事务间是可见的,哪些是不可见的。低级别的隔离通常可以执行更高的并发,系统的开销也更低。

隔离级别由低到高分别为:

READ UNCOMMITED(未提交读):事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这称为脏读。 因为这样会带来很多问题,所以实际中一般不用。

READ COMMITED(提交读):一个事务开始时,只能看到已经提交的事务所做的修改。也就是说一个事务提交之前,所做的修改对其他事务不可见。这个级别也称为不可重复读,因为同样的查询,执行两次可能得到不一样的结果。大多数数据库的默认级别都是READ COMMITED。

REPEATABLE READ(可重复读):该级别保证同一次事务中多次读取同样记录的结果是一致的。但是此隔离级别还是无法解决幻读问题。

幻读就是当一个事务读取某一范围内的记录时,另外一个事务又在该范围内插入了新的记录,这样之前的事务再次读取该范围内的记录时,会产生幻行。

SERIALIZABLE(可串行化):它强制事务串行执行。它会导致大量的锁争用问题,所以一般很少用。

另附一个学习 SQL语句的链接
http://www.w3school.com.cn/sql/sql_join.asp