题目
还知道有什么存储引擎么(MyISAM),这些存储引擎的区别
解释
类似问题如: 1. 执行 count(*) 采用哪个存储引擎性能更好?
答案
**在 MySQL 5.1 及之前的版本,MyISAM 是默认的存储引擎,而在 MySQL 5.5.5 后,InnoDB 成为了默认的存储引擎**。 1. **InnoDB 支持事务**,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一; 2. **InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁**。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一; 3. **InnoDB 支持外键**,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败; 4. **InnoDB 是聚簇索引,MyISAM 是非聚簇索引**。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。 5. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快 **如何选择:** 1. 是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM 2. **如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果写操作很频繁,请使用 InnoDB** > 为什么 MyISAM 会比 Innodb 的查询速度快? > > INNODB在做 `SELECT` 的时候,要维护的东西比 MYISAM 引擎多很多 > > - 数据块,INNODB要缓存,MYISAM 只缓存索引块, 这中间还有换进换出的减 > - InnoDB 寻址要映射到块,再到行,MYISAM 记录的直接是文件的 OFFSET,定位比 InnoDB 要快 > - InnoDB还需要维护MVCC一致;虽然你的场景没有,但他还是需要去检查和维护 3. 系统奔溃后,MyISAM 恢复起来更困难,能否接受,不能接受就选 InnoDB;