Whoosy's Blog

藏巧于拙 用晦而明 寓清于浊 以屈为伸

0%

Myisam和Innodb的区别

编码不易,转载请注意出处!

1、存储结构

InnoDB:底层是B+树,主键索引上的叶子结点存入的是一行所有列的数据,所以是索引组织表,数据和索引都放在一个文件。

MyISAM:底层也是B+树,不过叶子结点上存的是实际数据的指针地址,所以是堆表。MyISAM在磁盘上存储成三个文件,.frm文件存储表定义,.MYD 文件存储每行数据。.MYI 文件存储索引。

2、事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。

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

3、表锁差异

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

4、全文索引

MyISAM:支持 FULLTEXT类型的全文索引。

InnoDB:5.7之后才支持FULLTEXT类型的全文索引。

5、表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。

nnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

6、表的具体行数

MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出该值。

InnoDB:没有保存表的总行数,如果使用select count(*) from table,就是便利成本最小的索引树查询总行数,一般情况下是基于主键索引树去找,但是如果有搜索成本更小的,比如某个索引列上都是1字节的数据,那么就会走次索引。