🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。
🍊支持作者: 点赞👍、关注💖、留言💌~
前几天大明白在面试的过程中因为没有回答出来 Tomcat 调优的问题就被面试官刷下来了,于是他利用假期恶补了一番后又去参加了一场面试,但是这次面试依然是以失败告终了…
MySQL 的存储引擎大明白失望的给大聪明发了一条消息:“兄弟,MySQL 存储引擎是什么呀?我咋都没听过这个名词呢…😭”
聪明看到消息后回复道:“MySQL 你肯定用过吧,InnoDB 你也知道吧,InnoDB就是存储引擎中的一种”
大明白:“啊!这个就是搜索引擎啊,我之前还真没听说过这个名词😔”
大聪明:“你还是了解的太少了,今天正好没啥事,就给你说说我对 MySQL 存储引擎的见解”
P.S. 想了解关于 Tomcat 调优的小伙伴可以移步至:大聪明教你学Java | 面试官:谈谈你对 Tomcat 调优的看法
MySQL 中的数据用各种不同的技术存储在文件中,每一种技术都使用了不同的存储机制、索引技巧、锁定水平,并且最终提供的功能和能力也不相同,这些不同的技术以及配套的功能在 MySQL 中被称为存储引擎。MySQL 数据库有多种存储引擎,每种存储引擎有各自的优缺点,不同的引擎也为我们提供了不同的功能。我们可以从 MyISAM、InnoDB、MEMORY(HEAP)、BDB(BerkeleyDB)、ARCHIVE、CSV、BLACKHOLE 这些搜索引擎中按需选择,下面我们就先简单的了解一下这七个搜索引擎。
- MyISAM 管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM 在所有 MySQL 配置里被支持,它也是 MySQL 5.1(及以前版本) 默认的存储引擎。
- InnoDB 存储引擎可以看作是对 MyISAM 的进一步更新产物,它提供了事务、行级锁机制和外键约束的功能,它和 BDB 存储引擎一样,都是提供的事务安全表。
- MEMORY(HEAP) 引擎用于处理非事物表,它的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种引擎常应用于临时表中。
- ARCHIVE 引擎只支持 select 和 insert 语句,而且不支持索引。常应用于日志记录的场景。
- CSV 存储引擎把数据以逗号分隔的格式存储在文本文件中。
- BLACKHOLE 存储引擎接受但不存储数据,并且在检索时总是返回一个空集。
虽然 MySQL 为我们提供了如此之多的存储引擎,但是在我们日常的工作中,最常用到的还是 MyISAM 和 InnoDB 存储引擎,下面我们就具体的说说这两种存储引擎的特点和区别…
MyISAM 和 InnoDB在 MySQL 5.1 及之前的版本,MyISAM 是默认引擎。MyISAM 提供了全文索引、压缩、空间函数(GIS)等功能特性,但 MyISAM 并不支持事务以及行级锁,而且它还有一个不可忽视的缺陷,就是在崩溃后无法安全恢复。不过也正是由于 MyISAM 引擎的缘故,即使 MySQL 支持事务已经很长时间了,在很多人的概念中 MySQL 还是非事务型数据库,这也足以证明 MyISAM 在之前是有多受欢迎。
从 MySQL 5.5 之后的版本中,MySQL 默认的搜索引擎变就变为 InnoDB 了。它是 MySQL 默认的事务型引擎,也是最重要和使用最广泛的存储引擎。它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回滚。由于 InnoDB 存储引擎的性能与自动崩溃恢复的特性,使得它在非事务存储需求中也很流行。可能很多小伙伴都听过这么一句话:除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
看完 MyISAM 和 InnoDB 的简介,相信各位小伙伴对他们都有了一个初步的了解,下面我们再对比一下二者有什么不同之处。
MyISAM 和 InnoDB 的区别🍓区别一:存储结构不同
MyISAM:每个 MyISAM 在磁盘上存储成三个文件。分别为:表定义文件、数据文件、索引文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB 表的大小只受限于 *** 作系统文件的大小,一般为2GB。
🍓区别二:存储空间不同
MyISAM:支持支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。如果当表在创建并导入数据之后不会再进行修改 *** 作,我们就可以选择使用压缩表,它可以极大的减少磁盘的空间占用。
InnoDB:由于它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引,所以需要更多的内存和存储空间。
🍓区别三:可移植性、备份及恢复不同
MyISAM:MyISAM 引擎以文件的形式存储数据,所以在跨平台的数据转移中会很方便。在备份数据和恢复数据时也可以单独针对某个表进行 *** 作。
InnoDB:我们可以通过备份数据文件、备份 binlog,或者用 mysqldump 进行数据备份和数据恢复,但是在数据量达到几十G的时候这些文件就会变的比较庞大,拷贝的时候就相对麻烦了。
🍓区别四:事务支持
MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全型表。
🍓区别五:表锁不同
MyISAM:只支持表级锁,用户在 *** 作 MyISAM 表时,select,update,delete,insert 语句都会给表自动加锁,如果加锁以后的表满足 insert 并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,这也是 InnoDB 最大的特色。行锁大幅度提高了多用户并发 *** 作的新能。但是 InnoDB 的行锁,只在 WHERE 条件判断后跟随主键的情况下是有效的,非主键的 WHERE 条件判断都会锁全表的。
🍓区别六:全文索引
MyISAM:支持 FULLTEXT 类型的全文索引。
InnoDB:不支持 FULLTEXT 类型的全文索引,但是 InnoDB 可以使用 sphinx 插件实现全文索引,并且效果比 FULLTEXT 更好。
🍓区别七:主外键不同
MyISAM:允许没有任何索引和主键的表存在;不支持外键。
InnoDB:支持外键;如果在创建表时没有设定主键或者非空唯一索引,那么它就会自动生成一个六字节大小的主键(自动生成的主键用户不可见)。
🍓区别八:CRUD 执行效率不同
MyISAM:如果我们的应用程序中需要执行大量的 SELECT 语句,那么 MyISAM 存储引擎是更好的选择。
InnoDB:如果我们的应用程序中的数据需要执行大量的 INSERT 或 UPDATE 语句,那么出于性能方面的考虑,我们应该使用 InnoDB 存储引擎。这里多说一句,我们在 InnoDB 存储引擎下执行 DELETE 语句时,InnoDB 不会重新建立表,而是一行一行的删除数据,所以如果需要在 InnoDB 引擎上要清空有大量数据的表(清空数据但保留表结构),我们最好使用 truncate 语句。
🍓区别九:其他
MyISAM 和 InnoDB 的选择和应用场景如果我们使用 select count(*) from XXX; 语句查询表中的数据量,MyISAM 存储引擎的执行效率会高于 InnoDB 存储引擎,因为前者专门保存了表的总行数,而后者则需要一行一行的去查找,相当于对整个表进行遍历。
上面我们说完了 MyISAM 和 InnoDB 的特点和不同,我们也就可以看出两者可谓是各有千秋。INNODB 会支持一些关系数据库的高级功能,如事务功能和行级锁;MYISAM 的性能更优,占用的存储空间少。所以,选择何种存储引擎,视具体应用而定。如果你的应用程序一定要使用事务,毫无疑问要选择 INNODB 引擎,这也是目前大部分应用软件中所用到的搜索引擎;如果你的应用程序对查询性能要求较高,就要使用 MYISAM 搜索引擎了。MYISAM 索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存,同时 MYISAM 引擎支持全文索引,这可以极大地优化 LIKE 语句查询的效率,所以它的查询性能明显优于 INNODB。
小结总结起来就是一句话:MyISAM 引擎适合以查询、插入为主的应用(如个人博客、某某数据查询平台等);InnoDB 引擎适合频繁修改以及涉及到安全性较高的应用(如OA软件等)。
本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇
希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●’◡’●)
如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。
你在被打击时,记起你的珍贵,抵抗恶意;
你在迷茫时,坚信你的珍贵,抛开蜚语;
爱你所爱 行你所行 听从你心 无问东西
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)