工作中使用mysql越来越多了,常用的mysql引擎就是MyISAM和InnoDB,总结下这两种区别。
以便于自己后续选择引擎参考。一般有事务需求的话,就只能InnoDB。
但是涉及一些使用的仍有需要注意的地方。
MyISAM | InnoDB |
---|---|
非聚集索引:物理存储不按照索引排序 | 聚集索引:物理存储按照索引排序 |
索引文件和数据文件是分离的。索引文件按照B+树组织的,树的叶子节点的data域存放的是数据的地址。 |
数据文件本身就是按照B+树组织的的一个索引结构,树的叶节点的data域保存了完整的数据记录。 key是数据表的主键。 |
辅助索引和主索引结构上没有区别,只是主索引要求key是唯一的。而辅助索引的key可以是重复的。 辅助索引的data域存放的还是数据的地址。 |
辅助索引data域存放的是相应记录主键的值,而不是地址。 即按照辅助索引的搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引找到记录。 |
锁是表锁: 表锁结构简单,创建锁和释放锁的开销较小。但是锁的范围较大,容易导致冲突,从而影响并发度。 因此建议使用短操作sql语句,以缩短持有锁的时间,降低冲突。 |
提供行锁功能: 只有在索引上进行操作才会使用行锁功能。同时行锁的力度较小。能降低获取锁的冲突。提高并发度。 但是该锁实现复杂,创建锁和释放锁的开销要大。同时可能会引起死锁。 在非索引上操作仍然是表锁。 在有索引的字段上where 语句上会使用间隙锁。 |
| |
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持 | InnoDB提供事务支持事务,外部键等高级数据库功能 |
如果执行大量的SELECT,MyISAM是更好的选择 |
1.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表 2.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。 3.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用 |
select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的 | InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行 |