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时,所有的语句都使用轻量级互斥量(不是很安全)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值