侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

MySQL中InnoDB和MyISAM的存储引擎的差异

数据库  /  管理员 发布于 6年前   185

MySQL数据库区别于其他数据库的很重要的一个特点就是其插件式的表存储引擎,其基于表,而不是数据库。由于每个存储引擎都有其特点,因此我们可以针对每一张表来挑选最合适的存储引擎。

作为DBA,我们应该深刻的认识存储引擎。今天介绍两种最常见的存储引擎和它们的区别:InnoDB和MyISAM。

InnoDB存储引擎

InnoDB存储引擎支持事务,其设计目标主要就是面向OLTP(On Line Transaction Processing 在线事务处理)的应用。特点为行锁设计、支持外键,并支持非锁定读。从5.5.8版本开始,InnoDB成为了MySQL的默认存储引擎。

InnoDB存储引擎采用聚集索引(clustered)的方式来存储数据,因此每个表都是按照主键的顺序进行存放,如果没有指定主键,InnoDB会为每行自动生成一个6字节的ROWID作为主键。

MyISAM存储引擎

MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向OLAP(On Line Analytical Processing 联机分析处理)应用,适用于数据仓库等查询频繁的场景。在5.5.8版本之前,MyISAM是MySQL的默认存储引擎。该引擎代表着对海量数据进行查询和分析的需求。它强调性能,因此在查询的执行速度比InnoDB更快。

InnoDB和MyISAM的区别

事务

为了数据库操作的原子性,我们需要事务。保证一组操作要么都成功,要么都失败,比如转账的功能。我们通常将多条SQL语句放在begin和commit之间,组成一个事务。

InnoDB支持,MyISAM不支持。

主键

由于InnoDB的聚集索引,其如果没有指定主键,就会自动生成主键。
MyISAM支持没有主键的表存在。

外键

为了解决复杂逻辑的依赖,我们需要外键。比如高考成绩的录入,必须归属于某位同学,我们就需要高考成绩数据库里有准考证号的外键。

InnoDB支持,MyISAM不支持。

索引

为了优化查询的速度,进行排序和匹配查找,我们需要索引。比如所有人的姓名从a-z首字母进行顺序存储,当我们查找zhangsan或者第44位的时候就可以很快的定位到我们想要的位置进行查找。

InnoDB是聚集索引,数据和主键的聚集索引绑定在一起,通过主键索引效率很高。如果通过其他列的辅助索引来进行查找,需要先查找到聚集索引,再查询到所有数据,需要两次查询。

MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据的指针。

从InnoDB 1.2.x版本,MySQL5.6版本后,两者都支持全文索引。

auto_increment自增

对于自增数的字段,InnoDB要求该列必须是索引,同时必须是索引的第一个列,否则会报错:

mysql> create table test(    -> a int auto_increment,    -> b int,    -> key(b,a)    -> ) engine=InnoDB;ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

把(b,a)顺序替换为(a,b)即可。

而MyISAM可以将该字段与其他字段随意顺序组成成联合索引。

表行数

很常见的需求是看表中有多少条数据,此时我们需要select count(*) from table_name。

InnoDB不保存表行数,需要进行全表扫描。MyISAM用一个变量保存,直接读取该值,更快。当时当带有where查询的时候,两者一样。

存储

数据库的文件都是需要在磁盘中进行存储,当应用需要时再读取到内存中。一般包含数据文件、索引文件。

InnoDB分为:

  • .frm表结构文件
  • .ibdata1共享表空间
  • .ibd表独占空间
  • .redo日志文件

MyISAM分为三个文件:

  • .frm存储表定义
  • .MYD存储表数据
  • .MYI存储表索引

执行速度

如果你的操作是大量的查询操作,如SELECT,使用MyISAM性能会更好。
如果大部分是删除和更改的操作,使用InnoDB。

InnoDB和MyISAM的索引都是B+树索引,通过索引可以查询到数据的主键,不熟悉B+树的可以查看MySQL InnoDB索引原理和算法。两者的性能区别主要在于查询到数据主键后两者的处理方式却不同。

InnoDB会缓存索引和数据文件,一般以16KB为一个最小单元(数据页大小)和磁盘进行交互,InnoDB在查询到索引数据后实际得到的是主键的ID,它需要在内存中的数据页中查找该行的全部数据,但如果该数据不是加载过的热数据,还需要进行数据页的查找和替换,这其中可能牵涉到多次I/O操作和内存中数据查找,导致耗时较高。

而MyISAM存储引擎只缓存索引文件,不缓存数据文件,其数据文件的缓存直接使用操作系统的缓存,这点非常独特。此时相同的空间能够加载更多的索引,因此当缓存空间有限时,MyISAM的索引数据页替换次数会更少。根据前面我们知道MyISAM的文件分为MYI和MYD,当我们通过MYI查找到主键ID时,其实得到是MYD数据文件的offset偏移量,查找数据比InnoDB寻址映射要快的多。

但由于MyISAM是表锁,而InnoDB支持行锁,因此在牵涉到大量写操作时,InnoDB的并发性能比MyISAM好很多。同时InnoDB还通过MVVC多版本控制来提高并发读写性能。

delete删除数据

调用delete from table时,MyISAM会直接重建表,InnoDB会一行一行的删除,但是可以用truncate table代替。参考: mysql清空表数据的两种方式和区别。

锁

MyISAM仅支持表锁,每次操作锁定整张表。
InnoDB支持行锁,每次操作锁住最小数量的行数据。

表锁相比于行锁消耗的资源更少,且不会出现死锁,但同时并发性能差。行锁消耗更多的资源,速度较慢,且可能发生死锁,但是因为锁定的粒度小、数据少,并发性能好。如果InnoDB的一条语句无法确定要扫描的范围,也会锁定整张表。

当行锁发生死锁的时候,会计算每个事务影响的行数,然后回滚行数较少的事务。

数据恢复

MyISAM崩溃后无法快速的安全恢复。InnoDB有一套完善的恢复机制。

数据缓存

MyISAM仅缓存索引数据,通过索引查询数据。InnoDB不仅缓存索引数据,同时缓存数据信息,将数据按页读取到缓存池,按LRU(Latest Rare Use 最近最少使用)算法来进行更新。

如何选择存储引擎

创建表的语句都是相同的,只有最后的type来指定存储引擎。

MyISAM

1、大量查询总count

2、查询频繁,插入不频繁

3、没有事务操作

InnoDB

1、需要高可用性,或者需要事务

2、表更新频繁

推荐学习:MySQL教程

以上就是MySQL中InnoDB和MyISAM的存储引擎的差异的详细内容,更多请关注其它相关文章!


  • 上一条:
    在cnetos7上搭建mysql主从服务
    下一条:
    MySQL之锁和事务隔离级别(介绍)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客