每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

Mysql 中 MyISAM 和 InnoDB 的区别有哪些?

1. Mysql中InnoDB与MyISAM两种数据库引擎的区别

1. InnoDB 支持事务,MyISAM 不支持事务。对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一

个事务,这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一。

2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败。

3. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,

先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指

针。主键索引和辅助索引是独立的。(也就是说:InnoDB的B+树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值;而MyISAM的B+树主键索引和辅助索引的叶子节

点都是数据文件的地址指针。)

4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快

(注意不能加有任何WHERE条件)。

5. InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从

MyISAM 变成 InnoDB 的重要原因之一。

6. Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高;PS:5.7以后的InnoDB支持全文索引了。

7. MyISAM表格可以被压缩后进行查询操作。

8. InnoDB表必须有唯一索引(如主键)(用户没有指定的话会自己找/生产一个隐藏列Row_id来充当默认主键),而Myisam可以没有

9. Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI

  Innodb:frm是表定义文件,ibd是数据文件

  Myisam:frm是表定义文件,myd是数据文件,myi是索引文件

2. 如何选择使用InnoDB与MyISAM

1. 是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM。

2. 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使用InnoDB。

3. 系统奔溃后,MyISAM恢复起来更困难,能否接受,不能接受就选 InnoDB。

4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的。如果你不知道用什么存储引擎,那就用InnoDB,至少不会差。

3. InnoDB为什么推荐使用自增ID作为主键

  自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂(对比使用UUID)。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。

4. InnoDB引擎的4大特性:

1. 插入缓冲(insert buffer)

2. 二次写(double write)

3. 自适应哈希索引(ahi)

4. 预读(read ahead)

5. InnoDB与MyISAM详细比较参照下表

  MyISAM InnoDB
构成上区别

每个MyISAM在磁盘上存储成三个文件。文件名为表名,扩展名为文件类型。

.frm 文件存储表定义;
.MYD(MYData) 数据文件的扩展名;
.MYI(MYIndex) 索引文件的扩展名。
基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB
事务处理方面 MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持。

InnoDB提供事务支持事务,外部键等高级数据库功能。

表级锁

行级锁

InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

select、insert、update、delete操作 如果执行大量的 SELECT,MyISAM 是更好的选择。

1.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。

2.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

3.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

对于AUTO_INCREMENT类型的字段 必须包含只有该字段的索引 可以和其他字段一起建立联合索引
    InnoDB不支持FULLTEXT类型的索引。
  MyISAM类型的二进制数据文件可以在不同操作系统中迁移  
 
posted @ 2021-09-06 11:33  helloliyh  阅读(1641)  评论(0编辑  收藏  举报