AI智能
改变未来

简述mysql数据库引擎MYISAM和INNODB各自的区别和适应场景?

MySQL 5.1之前的版本默认是使用 MYISAM 搜索引擎。
MySQL 5.5之前的版本默认是使用 INNODB 搜索引擎。

区别:

1.从锁的颗粒度方面:
MYISAM 仅支持表级锁。(一方面加锁的开销小,不会出现死锁。另一方面并发的性能差。)
INNODB 支持行锁,也支持表锁。(一方面获取和释放锁的开销大,肯能出现死锁。另一方面并发性能较好。需要注意的是:行锁是通过给索引项加锁来实现的,所以只有通过索引来查询的时候,才使用行锁,否则是使用表锁。)

2.从能否开启事务方面:
MYISAM 是一个非事务性的引擎,不支持事务。所以可以提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。
INNODB 是一个事务性的引擎,支持事务。可以实现数据的回滚,它实现了四个标准的隔离级别,默认的隔离级别是可重复读。

3.从是否支持外键方面:
MYISAM 不支持外键。
INNODB 支持外键。

4.从是否可以全文检索方面:
MYISAM 支持全文检索。全文索引是指对char、varchar和text中的每个词建立倒排序索引,不支持中文分词。
INNODB 不支持全文检索。但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

5.主键方面:
MYISAM 允许没有主键的表存在。
INNODB 要求必须有主键。而如果在建表时没有显示的指定主键,InnoDB就会为每一行数据自动生成一个6字节的ROWID列,并以此做为主键。这种主键对用户不可见。

6.索引方面(重点):
6.1 MYISAM 的索引:
(1)使用 MYISAM 作为执行引擎,那对应的数据存储有三个文件。
例如:
user.frm文件:frm存放的是表的结构;
user.MYD文件:MYD存放的是数据;
user.MYI文件:MYI存放的是索引
(使用B+数结构,叶子节点中存放数据地址,用于到MYD文件中查询数据);
(2)关于主键索引,MyISAM使用B+树作为索引结构,叶子节点的data域存放的是数据记录的地址。所以 MYISAM 的索引被称为非聚集索引。
(3)关于辅助索引,与主键索引相同,只是辅助索引允许key值重复。
6.2 INNODB 的索引:
(1)使用 INNODB 作为执行引擎,那对应的数据存储有两个文件。
例如:
user.frm文件:frm存放的是表的结构;
user.idb文件:idb存放的是数据和索引(使用B+数结构,叶子节点中直接存放的就是数据);
(2)关于主键索引,INNODB 使用B+树作为索引结构,叶子节点的data域存放的是数据本身,由于 INNODB 的数据文件本身要按照主键聚集,所以 INNODB 的数据表必须有主键。INNODB 的索引被称为聚集索引。
(3)关于辅助索引,INNODB 的辅助索引的 data 域全部为主键,若主键很大,索引就会很大。

使用场景:

MYISAM 适合:
(1)做很多count 的计算,因为 MYISAM 内置了一个计数器,count(*)时它直接从计数器中读,而 INNODB 必须扫描全表。
(2)插入不频繁,如果执行大量的查询,MYISAM 是更好的选择;
(3)没有事务。
INNODB 适合:
(1)要求事务;
(2)如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用 INNODB 执行引擎;

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 简述mysql数据库引擎MYISAM和INNODB各自的区别和适应场景?