日期:2014-05-16  浏览次数:20356 次

MySQL中MyISAM和InnoDB的主要区别

MySQL最常用的两种引擎MyISAM和InnoDB:

①MyISAM不支持事务、外键等高级数据库功能

②MyISAM引擎对应的数据库文件结构为:一个表对应三个文件,分别为 tablename.frm(共有的),tablename.myd,tablename.myi,这三个文件分别存储的是表结构,表数据,索引

? ? InnoDB引擎默认会将所有表的数据和索引都存在data目录下的ibdata1文件中,如果开启独立表空间,则会每个表创建一个对应的.ibd文件,来存储数据和索引,其他的信息则还是放到ibdata1文件中。

③MyISAM引擎使用表锁,InnoDB提供行锁,且提供不加锁读取。但是InnoDB在执行不能确定扫描范围的SQL时会锁定全表

④MyISAM存储表中的行数,在使用count(*)统计全表记录数时会很快,InnoDB则需要全表扫描。但是在含有where语句的时使用count,两者的效率是一样的,因为都需要扫描全表

⑤InnoDB中自增长列必须是索引的,并且必须是第一索引列

?

? ? ? ? InnoDB使用一种锁机制来保证数据表自增长列的一致性,针对这个表innodb会维护一个计数器,每次有新数据插入的时候会锁定全表,计算最新的值,得到结果后,会立刻释放这个锁(注意这里不会等到事务结束才释放)。这个计数器会一直维护在内存中,知道服务重启后重新初始化。

? ? ? ? 上面的方式在大量的并发插入时候,会导致阻塞,甚至会达到最大连接数而使服务器崩溃,所以在5.1.22版本中引入了一种新的保证自增长一致性的解决方案--innodb使用一个轻量级互斥量,在可以预算判断插入数量的语句中,就预先分配好子增量,比如auto_increment=1,使用insert into (a) values(a1),(a2),(a3)插入三条语句,然后又插入一条语句,这时候虽然前三条数据还没有插入完成,但是已经知道执行后面的这条语句时auto_increment值为4,不会阻塞该语句的执行。

? ? ? ? 通过设置innodb_autoinc_lock_mode的值可以调整auto_increment的锁策略,该值为0时,全部使用表锁定;该值为1时,对于可判定插入行数的语句使用轻量级互斥量;该值为2时,所有的语句都使用轻量级互斥量(不是很安全)

?