Mysql存储引擎myisam与inndb的区别?

时间:2023-03-09 03:20:35
Mysql存储引擎myisam与inndb的区别?

最近在研究Mysql存储引擎这块,说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法,在此做一个大概总结:

其实在工作中用的最多也就是MYISAM和INNODB,INNODB是数据库5.6版本才有的,5.5只有MYISAN。而且默认创建表就是INNODB类型

最大的差距就是INNODB支持事物,MYISAM不支持。

查看数据库所有存储引擎:SHOW ENGINES; 系统默认INNODB(自动提交事物)set autocommit = 0; 设置为0 (关闭自动提交事物)

存储空间:

  MYISAM:可被压缩,存储空间较小,支持三种不同的存储格式:静态表(默认,但是数据末尾不能有空格,会被去掉),动态表,压缩表。
  INNODB:需要更多的内存和存储,它会在主内存中建立其专用的缓存池,用来高速缓存数据和索引。

可移植性,备份和恢复:

  MYISAM:数据是以文件形式存储,所以跨平台移植非常方便,备份和恢复可针对某个表进行操作。
  INNODB:直接拷贝数据文件,备份binlog(记录操作脚本),或者用mysqldump,在数据量非常大的时候就比较麻烦了,可以使用java脚本来导入和备份。

表和锁的差异:

  MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
  InnoDB:支持事务和行级锁,是innodb的最大特色。行锁提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

全文索引:

  MyISAM:支持 FULLTEXT类型的全文索引。
  InnoDB:5.6不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

表主键:

  MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
  InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

CURD:

  MyISAM:如果执行大量的SELECT,选择MyISAM更好。
  InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

外键:

  MyISAM:不支持
  InnoDB:支持

  通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表的类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,如果数据量和并发比较大还是选择INNODB吧。

分享一个Mysql5.6版本和连接工具:链接:https://pan.baidu.com/s/1phGRi969KaNwTz9VenmyuA 密码:g8ch