MyISAM 和InnoDB两种mysql引擎的对比

工作中使用mysql越来越多了,常用的mysql引擎就是MyISAM和InnoDB,总结下这两种区别。

以便于自己后续选择引擎参考。一般有事务需求的话,就只能InnoDB。

但是涉及一些使用的仍有需要注意的地方。

MyISAM InnoDB

非聚集索引:物理存储不按照索引排序

聚集索引:物理存储按照索引排序
索引文件和数据文件是分离的。索引文件按照B+树组织的,树的叶子节点的data域存放的是数据的地址。

数据文件本身就是按照B+树组织的的一个索引结构,树的叶节点的data域保存了完整的数据记录。

key是数据表的主键。

辅助索引和主索引结构上没有区别,只是主索引要求key是唯一的。而辅助索引的key可以是重复的。

辅助索引的data域存放的还是数据的地址。

辅助索引data域存放的是相应记录主键的值,而不是地址。

即按照辅助索引的搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引找到记录。

锁是表锁:

表锁结构简单,创建锁和释放锁的开销较小。但是锁的范围较大,容易导致冲突,从而影响并发度。

因此建议使用短操作sql语句,以缩短持有锁的时间,降低冲突。

提供行锁功能:

只有在索引上进行操作才会使用行锁功能。同时行锁的力度较小。能降低获取锁的冲突。提高并发度。

但是该锁实现复杂,创建锁和释放锁的开销要大。同时可能会引起死锁。

在非索引上操作仍然是表锁。

在有索引的字段上where 语句上会使用间隙锁。

 
  1. 不宜使用过长的字段作为主键。因为所有辅助索引都是用主索引,过长的主索引会使得辅助索引变的过大。
  2. 尽量不要使用非单调的主键: 因为InnoDB数据文件本身就是一个B+ tree,非单调的主键会造成插入新纪录时数据文件为了维护B+ tree的特性而频繁的分裂 调整,十分低效。而使用自增字段作为主键则是一个很好的选择。
 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要扫描一遍整个表来计算有多少行

你可能感兴趣的:(Database-,mysql,数据库,mysql,MyISAM,InnoDB)