目录一. 简单了解什么是存储引擎?二. InnoDB 引擎概述三. MyISAM 引擎概述四. InnoDB 与 MyISAM 的一些区别一. 简单了解什么是存储引擎?相信很多人在听到存储引擎这个名字的时候可能会有些疑惑听着名字就觉得有些难导致很多人没有兴趣了解它那么它这究竟是个什么东西我来说明一个场景大家就能大概明白它是做什么用的了。我们都知道既然是数据库我们就是用来存储数据的数据库中会有很多的表那么各位有没有想过数据库底层究竟是以什么样的格式存储这些表的数据的呢这就会用到我们存储引擎存储引擎在以前叫做表处理器是后来才改名叫存储引擎的它的功能就是接收收到的指令然后对表中的数据进行读写操作。你可以把它理解为存储数据库的表时表的类型在MySQL数据库中有很多的存储引擎它们在存储数据库的表时存储格式也是不一样的。举个栗子假设我们的学生表 t_student 使用了A存储引擎那么底层存储学生表信息时采用了 .txt 文本文件的格式进行存储我们的用户表 t_user 使用了B存储引擎那么底层在存储用户表中的信息时会采用 .doc Word文档的形式存储。也就是说存储引擎不同数据库底层在存储这些表的数据的时候采用的存储格式也不相同这样说各位应该就能理解了吧。在 MySQL数据库中有好多种存储引擎这里我重点说明 InnoDB和MyISAM这两种也是面试中经常问到的两种引擎问的最多的也是这两种引擎的原理和区别。二. InnoDB 引擎概述1MySQL 自从 3.23.34 开始就包含了InnoDB引擎在 5.5 的版本之后 InnoDB 成为了 MySQL 的默认存储引擎2InnoDB 引擎对于数据的增删改查都具有很好的性能支持3InnoDB 本身是为了处理巨大量的数据的而设计的 当我们表中存储的数据非常非常多时InnoDB 存储引擎能很好地发挥出它性能的优越性提高数据的检索效率这与它底层存储数据和索引的结构有关系。4InnoDB 引擎还支持数据库表外键的功能。而且InnoDB 引擎是MySQL数据库众多引擎中唯一一个支持事务的引擎可以确保事务的完整提交(Commit)和回滚(Rollback)。在一般情况下我们建表时都会使用InnoDB作为存储引擎因为现在绝大多数业务都需要用到事务而InnoDB引擎又是唯一一个支持事务的存储引擎。5在数据库的底层使用不同的存储引擎它们底层在存储数据的时候生成的文件也是不同的在8.0以后的版本中 InnoDB 存储引擎中数据文件就只有一个 表名.ibd 文件了它里面不仅会存储表的结构以及表的数据还有索引也会一并存入其中生成一个文件合三为一这一点要记住与下面我们要说的 MyISAM 引擎存储数据时文件的格式有区别哦6正是由于 InnoDB 存储引擎将所有的信息存储到了一个数据文件中所以在读取数据时InnoDB 引擎会把整个文件都读取到内存中并缓存起来当然其中就有缓存的索引表中的数据如果很多那么读取之后占用的内存也会很大因此从另一方面来讲 InnoDB 引擎对内存要求较高效率也会受内存的影响。7此外因为 InnoDB 存储引擎支持事务所以当我们的数据库在受到网络波动或者服务器宕机等一系列不可控不过因素导致崩溃时它就会开启事务保护功能我们再次重启数据库服务器它就会自动从上一次崩溃的时候重新恢复数据正常运行极大程度地保证了我们数据的安全性。三. MyISAM 引擎概述1MyISAM 引擎也是数据库中一个比较重要的引擎它提供了大量的特性全文索引压缩空间函数等但不支持事务行级锁外键等功能。因此当服务器崩溃时它就无法基于事务的功能保证数据的安全性崩溃后数据也无法恢复。2在5.5 版本之前MyISAM 是数据库的默认存储引擎到了5.5 版本之后才从 MyISAM 转换成了 InnoDB 。3MyISAM 存储引擎中数据的优势是访问速度特别快主要针对于对事务完整性没有要求的 SELECT与INSERT 两个操作。最形象的就是历史相关软件我们可以向数据库中添加历史信息查询浏览历史信息但几乎不会去更新历史信息或者删除历史信息否则不就成了纂改历史了吗。4MyISAM 存储引擎中它是有一个常量存储表中的数据量的即 COUNT(*)因此他的时间复杂度为O(1)而我们的 InnoDB 存储引擎在去统计数据时则是去一条数据一条数据的累加是现用现算因此时间复杂度为O(n)因此在数据量的统计上来说MyISAM 引擎性能是高于 InnoDB 的。5刚才我们提 InnoDB 引擎的时候他也说到了它的数据文件是三个合成了一个文件而 MyISAM 则没有它是分成了三个文件分别存储表的结构表的数据以及表的索引。在底层形成的三个文件分别是 表名.sdi(存储表结构)表名.MYD(存储表的数据)表名.MYI(存储索引)。四. InnoDB 与 MyISAM 的一些区别InnoDB 存储引擎与 MyISAM 的一些区别我直接放到下边了重点记住我画线的五个这要是给大家来说说行表锁。行表锁其实不难理解我举个栗子各位就懂了。假设现在有一张用户user 表有张三和李四两条用户数据。如果我们采用的是 InnoDB 存储引擎当我们对张三数据进行读写操作的时候我们只会把张三这一行的数据锁起来不让其他的线程的读写操作对我们造成干扰但是如果有线程想要操作李四的信息是完全可以的因为李四的数据并没有被锁起来我们锁住的就是张三这一行的数据极大程度的提高的并发性能而假如说我们采用的是 MyISAM 存储引擎当我们对张三的数据进行读写操作的时候会把整张用户表都锁起来即便是有其他操作想要对李四进行读写操作也不行必须等到张三的信息操作完成才可以这样各位就能理解了吧其实这个行表锁有点类似于Java中的 HashTable与 ConcurrentHashMapHashTable就是操作时锁起来整个数据不让其他线程进来而ConcurrentHashMap 则是只锁我们链表的头节点对其他哈希桶位元素的操作不影响能够适应多线程并发操作。