InnoDB和MyISAM区别
Mysql默认存储引擎为InnoDB。
1.InnoDB支持事务,MyISAM不支持事务。
2.InnoDB支持外键,MyISAM不支持外键。
3.InnoDB是聚集索引,MyISAM是非聚集索引。
- 聚集索引的文件主要存放在主键索引的叶子节点上,因此InnoDB是必须要有主键的,通过主键索引查询效率很高,但是辅助索引需要两次查询,先查询主键,再通过主键去查询数据。因此主键不应该过大,主键太大导致其它索引也都会很大。
- MyISAM是非聚集索引,数据文件是分离的。索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
4.InnoDB不保存表的具体行数,select count(*) from table时需要全表扫描。MyISAM用一个变量保存了整个表的行数。执行上述语句时只需要读出变量即可,速度很快。
5.InnoDB最小的锁粒度是行锁,MyISAM最小的锁粒度是表锁。MyISAM 一个更新语句会锁住整张表,导致其它查询或者更新等操作会被阻塞。
InnoDB中索引
Mysql中默认的存储引擎为Innodb。Innodb中有聚簇索引和非聚簇索引。
其中聚簇索引就是主键索引,按照每张表的主键构造一棵B+树,同时叶子节点中存放的是表的一整行数据。
非聚簇索引又称为辅助索引,包括唯一索引,前缀索引,组合索引等。
InnoDB通过主键来聚集数据,如果没有定义主键,InnoDB会选择非空的唯一索引来替代,如果这样的索引不存在,InnoDB会隐式地定义一个主键来作为聚簇索引。
聚簇索引优点和缺点:
优点:
a.数据访问更快。因为聚簇索引将索引和数据都保存在同一个B+树中。
b.聚簇索引对于主键的排序查找或者范围查找速度非常快。
缺点:
a.更新主键的代价较高。因为会导致被更新的行移动。
b.辅助索引需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。
非聚簇索引(辅助索引)
在聚簇索引上创建的索引成为辅助索引,辅助索引访问数据需要二次查找。
辅助索引的叶子节点存储的不再是行的物理地址,而是主键值。辅助索引先找到主键值,在通过主键值找到对应的数据。
由于叶子节点只能按照一棵B+树排序,所以一张表只能由一个聚簇索引。辅助索引的存在不影响聚簇索引的组织,所以一张表可以有多个辅助索引。
MyIsam中索引
MyIsam中索引和数据是分离开的,索引文件保存数据记录的地址。
1.MyIsam中主键索引:
使用B+树作为索引结构,叶子节点中存放的是数据记录的地址。
2.MyIsam中辅助索引和主键索引在结构上没有区别,主键索引要求key是唯一的,而辅助索引的key可以重复。