MyISAM 是MySQL的默认数据库引擎(5.5以后默认是InnoDB)性能极佳,但不支持事务处理。

InnoDB 是MySQL的数据库常用的数据引擎。

MyISAM 和 InnoDB 两者之间有明显的区别,简单梳理一下:

  1. 事务

    • MyISAM:每次查询具有原子性,执行速度比i快但是不支持事务操作。
    • InnoDB:提供事务、回滚、崩溃修复能力的事务安全(ACID)型数据引擎
  2. 存储
    • MyISAM:每个MyISAM表在磁盘上存储成三个文件。分别是表定义文件(表名xx.frm)、数据文件(表名xx.MYD)、索引文件(表名xxx.MYI)。MyISAM还支持三种不同的存储格式,动态表,静态表,压缩表,存储开销依次变小,执行开销依次增大。
    • InnoDB:属于索引组织表。有两种存储方式,分别是共享表空间和多表空间存储。
    • 共享表空间:所有的表都保存在同一个数据文件中。InnoDB表文件的大小之受限于操作系统文件的大小。InnoDB在存储上需要更多的内存和磁盘空间,他会在主存中建立其专用的缓冲池用于高速存取数据与索引。
    • 多表空间存储:每个表都有一个表空间用于存储每个表的数据和索引 (表名.idb)。
  3. 数据移植、备份、恢复
    • MyISAM:数据是以稳健的形式存储,所以在跨平台的数据转移中会很方便。可以对单个表进行操作。
    • InnoDB:由于多个表保存在同一个文件中,只能拷贝整体文件,备份binlog,或者用mysqldump。
  4. 主键
    • MyISAM:允许没有任何索引和主键 的表存在,索引保存的是行的地址
    • InnoDB:如果没有设置主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。
  5. 外键
    • MyISAM不支持外键,InnoDB支持。
  6. 索引
    • 全文索引:MyISAM全文索引不支持中文(中文需要sphinx),i也支持了(但可以用sphinx插件支持,效果还不错)
    • 另外,MyISAM索引和数据分离,天生非聚簇索引,最多有一个unique的性质。i的数据文件本身就是主键索引文件,这样的索引被称为聚集索引。
    • MyISAM引擎使用b+tree作为索引结构,叶节点的不存放实际数据,存放实际数据的地址,叫做非聚集索引。
    • InnoDB引擎也是用b+tree作为索引结构,但实现方式与m截然不同。一个重大区别是i的数据文件本身就是索引文件(而MyISAM索引文件是与数据文件分离的,主键索引与其他索引在实现上没有区别),子叶节点的数据域部分保存了完整的行记录,这个b+tree的key是表的主键,这种索引叫做聚集索引。
    • 但是,InnoDB中的其他索引在查询时就没有那么幸运了,需要先在其他索引中查询到对应主键,再在聚集索引中查找对应的行。
    • mysql支持三种锁定级别,行级,页级,表级别
    • MyISAM支持表级锁,读写互相阻塞,读阻塞写,写阻塞读写,读不阻塞读。
    • InnoDB支持行级锁(where 字段是主键),表锁,但InnoDB的行锁也不是绝对的,当在执行一个sql语句且mysql不能确定要扫描的范围时,i同样会全表加锁,当确定范围时会加间隙锁。
      • update table set num = 1 where name like ‘%xxx%’; ---退化表锁
      • update table set num = 1 where name = 123             ---隐式转换 退化表锁
      • update table set num = 1 where id >50  -------------------间隙锁
  7. 隔离级别 
    • MyISAM 无隔离级别 只有表锁。
    • InnoDB 隔离级别 (详见下一篇文章)
  8. auto_increment
    • MyISAM 自动增长列必须是索引,如果是组合索引,自动增长列可以不是一地列,他可以根据前面几列排序递增。
    • InnoDB 自动增长列必须是索引,如果是组合索引必须是组合索引的第一列。
  9. 查询行数
    • MyISAM 保存有表的总行数 select count(*) from a;会直接取出对应值。
    • InnoDB 没有保存,需要遍历整张表。
  10. drop table
    • drop table 的处理方式不一样 m会重新建立表,InnoDB不会重新建立表,而是一行一行的删除。因此速度非常慢,推荐是用truncate table。

MySQL 的两种存储引擎的更多相关文章

  1. Mysql的两种存储引擎以及区别

    一.Mysql的两种存储引擎 1.MyISAM: ①不支持事务,但是整个操作是原子性的(事务具备四种特性:原子性.一致性.隔离性.持久性) ②不支持外键,支持表锁,每次所住的是整张表     MyIS ...

  2. mysql的两种存储引擎

    MySQL 有多种存储引擎,目前常用的是 MyISAM 和 InnoDB 这两个引擎,除了这两个引擎以为还有许多其他引擎,有官方的,也有一些公司自己研发的.这篇文章主要简单概述一下常用常见的 MySQ ...

  3. MYSQL的两种存储引擎区别

    Innodb引擎 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别.该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL ...

  4. Mysql有两种存储引擎:InnoDB与Myisam

    http://www.cnblogs.com/kevingrace/p/5685355.html

  5. MySQL的两种存储引擎storage engine特点和对比

    MyISAM 优点:快速读取数据, 占用空间小 缺点:不支持事务,外键 (表级别锁) InnoDB 优点:支持事务,外键; 高性能(CPU效率高) 缺点: 慢,占空间 (行级别锁)

  6. MySQL两种存储引擎: MyISAM和InnoDB

    MySQL两种存储引擎: MyISAM和InnoDB 简单总结   MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Me ...

  7. MySQL - 两种存储引擎 (MyISAM PK InnoDB) + MVCC

    总结 1.两种存储引擎各有各的有点,MyISAM专注性能,InnoDB专注事务.两者最大的区别就是InnoDB支持事务,和行锁. 2.InnoDB采用MVCC(Multi-Version Concur ...

  8. mysql 有两种数据库引擎发音

    mysql 有两种数据库引擎 一种是 MyISAM,一种是 InnoDB MyISAM 发音为 "my-z[ei]m"; InnoDB 发音为 "in-no-db&quo ...

  9. mysql中四种存储引擎的区别和选择

    前言 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 ...

随机推荐

  1. 在iOS下-input[disabled] 颜色变浅兼容&& input[readonly]仍可获取焦点解决方法

    目标:在写input输入框时,想让其只读不写. 环境:在iPhone上 本来用的时readonly,可是readonly,居然可以获取焦点,不能弹出键盘:安卓手机完全木有问题,所以去用了disable ...

  2. elasitic search fresh flush segment merge

    new document首先在in memory buffer 中 (1)fresh 触发条件:默认one second 执行一次 执行过程:将memory buffer中documents 写入至f ...

  3. Burp Suite Professional 针对APP抓包篡改数据提交【安全】

    Burp Suite 是用于攻击web 应用程序的集成平台,包含了许多工具.Burp Suite为这些工具设计了许多接口,以加快攻击应用程序的过程.所有工具都共享一个请求,并能处理对应的HTTP 消息 ...

  4. ubuntu安装pyenv

    安装依赖包 bash {.line-numbers} sudo apt-get update sudo apt-get install build-essential python-dev pytho ...

  5. 微信小程序之数组操作:push与concat的区别

    微信小程序中需要用到数组的操作,push和concat二者功能很相像,但有两点区别. 先看如下例子: var arr = []; arr.push(); arr.push(); arr.push([, ...

  6. Python之路Day09

    函数 将某个功能封装到一个空间中就是一个函数 减少重复代码 函数体中存放的时代码 定义函数 def len(): def 关键字 len 函数名 -- 变量名 ()格式规定 :语句结束 调用函数 函数 ...

  7. [SHOI2001] 小狗散步 - 二分图匹配

    考虑到每次与主人相遇之前最多只去一个景点,很容易转化为匹配问题 由于数据很小,我们不妨枚举每个相遇点间隙和每个景点,判断是否来得及,如果来得及就连边 沙雕题搞了二十来分钟,我是憨憨 #include ...

  8. 区间无修改莫队学习笔记(lg1494小z的袜子)

    这几天感觉要学的要做的有点多,就偷了个懒没写笔记,赶紧补一下 莫队嘛,一个离线处理各种区间(或树上)询问的神奇算法 简单而言,按左端点排个序然后指针l,r递推就好了 复杂度证明貌似是不待修改的n^1. ...

  9. [POI2005]KOS-Dicing (最大流+二分)lg3425

    题面https://www.luogu.org/problemnew/show/P3425 题面说赢的最多的人最少赢几场,肯定是向二分的方向思考 建立源点向每一场比赛连容量为1的边,从每场比赛向参赛两 ...

  10. npm 模块开发调试技巧之最优方案npm link

    在我们平时写项目中,当我们需要新开发或修改的 npm 模块时,如何在本地项目中调试呢? 本地项目路径:G:\npm\project 开发的模块路径:G:\npm\model 方法一: 在cmd命令窗口 ...