MySQL存储引擎是什么?
- MySQL中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现
MySQL存储引擎的选择
- 5.5之前默认存储引擎是MyISAM,5.5之后默认存储引擎是Innodb
具体说说MyISAM
首先MyISAM支持全文检索,不支持事务和行级锁,只有表级别锁,它适用于 OLAP 场景,也就是分析类的,基本上都是读取,不会有什么写入动作的场景
其次它的数据和索引是分离存储的,也就是不在一个文件上,并且数据库只会缓存索引文件,数据文件的缓存直接交给操作系统搞定
然后MyISAM 的索引也是 B+ 树,只是不像 InnoDB 那种叶子节点会存储完整的数据,MyISAM 的数据是独立于索引单独存储的,所以主键和非主键索引差别不大
还有一个情况就是 MyISAM 不支持崩溃后的安全恢复,而 InnoDB 有个 redolog 可以支持安全恢复
再有一点就是 MyISAM 写入性能差。因为锁的粒度太粗了,不支持行锁,只有表锁,所以写入的时候会对整张表加锁
具体说说Innodb
InnoDB 支持事务,实现了四种标准的隔离级别,利用 MVCC 来支持高并发,默认事务隔离级别为可重复读,支持行锁,利用行锁+间隙锁提供可重复读级别下防止幻读的能力,支持崩溃后的数据安全恢复
另外还支持外键
InnoDB 的主键索引称为聚簇索引,也就是数据和索引是放在一起的,这与 MyISAM 有所不同,并且它的辅助索引(非主键索引)只存储索引值与主键,因此当辅助索引不能覆盖查询的列时,需要通过找到的主键再去聚簇索引查询数据,这个过程称之为****回表
它之所以能取代 MyISAM 成为默认引擎就是因为事务的支持、 Innodb的关键特性、崩溃后的数据安全恢复例如MVCC
Innodb和MyISAM的区别
- Innodb支持事务,MyISAM不支持事务
- MyISAM不支持外键,InnoDB支持外键
- MyISAM只支持表级锁,InnoDB支持行级锁和表级锁,默认是行级锁
- MyISAM支持全文索引,InnoDB不支持全文索引
- MyISAM支持没有主键的表存在,InnoDB不支持没有主键
- MyISAM较简单,效率上优于InnoDB,适合小型应用
- MyISAM使用非聚集索引,InnoDB使用聚集索引