引用
- MyISAM与InnoDB 的区别(9个不同点)
- https://www.lagou.com/lgeduarticle/26526.html
MyISAM与InnoDB对比
Innodb | MyISAM | |
---|---|---|
事务 | Y | N |
外键 | Y | N |
索引 | * 聚集索引,B+树作为索引结构 * 主键索引的叶子节点即数据文件 * 必须要有PK,PK索引效率很高 * 但是辅助索引需要两次查询,先查询到主键,再查询到数据,因此,主键不应过大,否则其他索引也很大 | * 非聚集索引,B+树作为索引结构 * 索引与数据分离,索引保存的是数据文件的指针 |
数据表行查询 | 需要select count(\*) from table 时需要全表扫描 | 变量保存,查询很快 |
全文检索 | 5.7后支持 | 支持,查询效率高 |
锁 | 表锁、行锁(默认) 注:行锁是实现在索引上,而不是锁在物理有上,即是说访问没有命中索引,也无法使用行锁,退化为表锁 | 表锁 |
存储文件 | * frm:表定义文件 * ibd:数据文件 | * frm:表定义文件 * myd:数据文件 * myi:索引文件 |
SELECT性能 | 慢 | 快 |
-
MyISAM比Innodb查询快的原因?
- INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多:
- 数据块,INNODB要缓存,MYISAM只缓存索引块, 这中间还有换进换出的减少;
- innodb寻址要映射到块,再到行,MYISAM记录的直接是文件的OFFSET,定位比INNODB要快
- INNODB还需要维护MVCC一致;虽然你的场景没有,但他还是需要去检查和维护MVCC (Multi-Version Concurrency Control)多版本并发控制
- INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多:
-
如何选择?
- 要支持事务,使用innodb
- 绝大多数都只是查询,考虑使用MyIsam
- crash后,MyISAM恢复困难
- 5.5默认为Innodb
-
InnoDB为什么推荐使用自增ID作为主键?
答:自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂(对比使用UUID)。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。
聚集索引与非聚集索引
- 聚簇索引是唯一的,一个 InnoDB 表只有一个聚簇索引,而且一定会有一个聚簇索引,如果不存在,Innodb 存储引擎会自动添加一个(
GEN_CLUST_INDEX
的隐式的聚簇索引 ) - 非聚簇所以可以有多个,而且只能由用户自己添加,InnoDB 默认并不会创建任何非聚簇索引。
附录
- InnoDB未命中索引
t_user(uid, uname, age, sex) innodb;
uid PK
无其他索引
update t_user set age=10 where uid=1; 命中索引,行锁。
update t_user set age=10 where uid != 1; 未命中索引,表锁。
update t_user set age=10 where name='chackca'; 无索引,表锁。