MyISAM 和 InnoDB 区别

1、MyISAM不支持事务,InnoDB是事务类型的存储引擎

2、MyISAM只支持表级锁,而InnoDB支持行级锁表级锁默认为行级锁

MyIsam -> 表锁

对于write,如果表上没有锁,则在上面绑定一个写锁,否则丢到写锁队列中。

对于read,如果表上没有锁,则在上面绑定一个读锁,否则丢到读锁队列中。

    当一个锁被释放的时候,表会先被写锁队列的线程获得,然后才是读锁队列,这意味着如果有很多更新的情况下,得等所有写锁线程执行完才能返回select的内容。

         InnoDB -> 行锁

    优点:①行级锁是Mysql中锁力度最小的,在数据量大的情况下能减少冲突的情况。

          ②回滚的时候只需要少量的更改

          ③可以长时间锁定单一行

    缺点:①行级锁需要占用更多内存

          ②相比表锁和页锁需要绑定更多的锁

          ③执行效率上会比表锁和行级锁慢

          ④行级锁会导致死锁

    原因分析:

          行级锁锁定的是索引。索引分为主键索引和非主键索引。当操作的是主键索引,则会直接锁定主键索引。当操作的是非主键索引,则会先去锁定非主键索引,然后再锁定主键索引。

    举例:

    表A:(Id,State,Time) 主键索引Id、非主键索引State

    当一个SQL 执行 Update A set State = 1 Where State = 2;时,会锁定State的索引,然后请求锁定主键索引Id.

    而同时另一个SQL 执行 Update A set State = 2 Where Id = 1;会锁定Id索引,由于修改的又是State = 2的数据,同时也会请求锁定State的索引。这样彼此相互等待着,就会导致死锁产生。

 

3、MyISAM不支持外键,InnoDB支持外键

4、MyISAM引擎的表在高并发的情况下容易造成损坏

   恢复方式:可以使用Mysql自带的myisamchk工具: myisamchk -r tablename 或者 myisamchk -o tablename(比前面的更保险) 对表进行修复

   损坏原因:服务器突然断电导致数据文件损坏、mysqld进程在写入的时候被kill了、磁盘故障...

 

5、MyISAM保存count(*)的值,InnoDB需要每次扫描全表统计

6、MyISAM支持全文索引(FULLTEXT),InnoDB不支持

7、MyISAM引擎的表的查询、更新、插入的效率要比InnoDB高

   对于数据量不大,百万级别,写少的用MyISAM比较适合。

   对于数据量大,读写多,用InnoDB适合,InnoDB适合管理。

 

 

 

猜你喜欢

转载自mdxdjh2.iteye.com/blog/2202492