本文共 1505 字,大约阅读时间需要 5 分钟。
MYSQL的两种存储引擎MyISAM与InnoDB的区别是什么?
1. MyISAM与InnoDB关于锁方面的区别是什么?
- MyISAM默认用的是表级锁,不支持行级锁;
- InnoDB默认用的是行级锁,也支持表级锁。
2. MyISAM和InnoDB适合的场景有哪些?
- MyISAM适合的场景
- 频繁执行全表count语句;
- 对数据进行增删改的频率不高,查询非常频繁;
- 没有事务;
- InnoDB适合的场景
- 数据增删改查都相当频繁;
- 可靠性要求比较高,要求支持事务;
3. MyISAM和InnoDB引擎的区别是什么?
- InooDB支持事务,MyISAM不支持事务;
- InnoDB支持外键,MyISAM不支持;
- InnoDB是聚集索引,MyISAM是非聚集索引;
- InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描,而MyISAM用一个变量保存了整个表的行数,执行上述语句只需读出该变量即可,速度很快。
- InooDB最小的锁粒度是行锁,MyISAM最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。
4.MyISAM和InnoDB索引的区别是什么?
MyISAM索引和InnoDB索引实现:
(1) MyISAM索引实现:
非聚集性索引
a.主键索引
MyISAM引擎使用B+树作为索引结果,叶子结点的data域存放的是数据记录的地址。下图为MyISAM表的主索引,Col1为主键。
b.辅助索引
在MyISAM中,主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。下图在Col2上建议一个辅助索引。
同样是一棵B+树,data域保存数据记录的地址。因此,MYISAM中索引检索的算法为首先按照B+ Tree搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后 以data域的值为地址,读取相应数据记录。
(2) InnoDB
聚集性索引
a.主键索引
同样是B+树,实现方式却完全不同。InnoDB表数据文件本身就是一个索引结构,树的叶节点data域保存了完整的数据记录,这种索引叫做聚集索引。
因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则mysql会自动选择一个可以唯一标识数据记录的列作为主键。如果不存在这种列,则mysql自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。
b.辅助索引
nnoDB的所有辅助索引都引用主键作为data域。下图为定义在Col3上的一个辅助索引
因此InnoDB 的索引能提供一种非常快速的主键查找性能。不过,它的辅助索引也会包含主键列,所以如果主键定义的比较大,其他索引也将很大。InnoDB 不会压缩索引。
聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。
转载地址:https://codingchaozhang.blog.csdn.net/article/details/114693800 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!