MyISAM 和InnoDB两种mysql引擎的对比

本文详细对比了MySQL中常用的MyISAM和InnoDB引擎的区别,包括索引结构、锁机制、性能特点及使用场景,帮助读者在实际应用中做出合适的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作中使用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要扫描一遍整个表来计算有多少行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值