ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【MySQL】MySQL技术内幕:深入理解 InnoDB 和 MyISAM 存储引擎

2020-01-24 17:09:29  阅读:271  来源: 互联网

标签:存储 聚簇 索引 InnoDB MyISAM MySQL 主键


文章目录

引言

MySQL的存储一引擎有很多,包括InnoDB 、MyISAM 、FEDERATED 、MEMORY、CSV等等,但常用的是前两个,5.1版本之前MySQL默认的存储引擎是MyISAM,之后的默认是InnoDB,那么这两种存储引擎底层有哪些区别,对性能又有什么影响呢?本篇将带你深入了解这些。

1. InnoDB

InnoDB 引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。

2. MyISAM

MyISAM没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和InnoDB 不同,MyISAM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyISAM也是很好的选择。

3. InnoDB和MyISAM存储引擎的区别

3.1 两种存储引擎的区别小结

1、InnoDB支持事务,而MyISAM不支持事务。

2、InnoDB支持行级锁,而MyISAM锁的粒度是表级的。

3、InnoDB不支持全文索引FULLTEXT,而MyISAM支持。

4、InnoDB 中不保存表的具体行数,在执行select count(*) from table时,InnoDB要扫描全表来计算有多少行,但是MyISAM保存了表的具体行数,只要简单的读出保存好的行数即可。
5、InnoDB是聚簇索引,而MyISAM是非聚簇索引。

3.2 聚簇索引和非聚簇索引原理

由上述对比可知,InnoDB使用的是聚簇索引而MyISAM是非聚簇索引,事实上无论是聚簇索引还是非聚簇索引采用的都是B+树结构。B+树的结构如图所示:
在这里插入图片描述
InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上。若使用"WHERE id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。
MyISAM的是非聚簇索引,B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。非聚簇索引中,主键索引和辅助索引最大的区别在于主键索引中的key一定得是唯一的。非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致,只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。查找过程如下图所示:
在这里插入图片描述

4. 小结

InnoDB适用于事务处理、具有ACID事务支持等特性,如果在应用中执行大量INSERT和UPDATE操作,应该选择InnoDB,如果SELECT操作更多,则应该考虑MyISAM。

Katakuly 发布了27 篇原创文章 · 获赞 12 · 访问量 3万+ 私信 关注

标签:存储,聚簇,索引,InnoDB,MyISAM,MySQL,主键
来源: https://blog.csdn.net/Carson_Chu/article/details/104074966

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有