特征 MyISAM InnoDB
聚集索引
压缩数据 是(仅当使用压缩行格式时才支持压缩MyISAM表。使用压缩行格式和MyISAM的表是只读的。)
数据缓存
加密数据 是(通过加密功能在服务器中实现) 是(通过加密功能在服务器中实现;在MySQL 5.7及更高版本中,支持数据静态表空间加密)
全文搜索索引 是(在MySQL 5.6及更高版本中可以使用InnoDB对FULLTEXT索引的支持。)
外键支持
地理空间索引支持 是(在MySQL 5.7及更高版本中可以使用InnoDB对地理空间索引的支持)
锁定粒度
MVCC
存储限制 256TB 64TB
事务

聚集索引

MyISAM中没有聚集索引,这是InnoDB特有的。官方文档是这么说的:

  • When you define a PRIMARY KEY on your table, InnoDB uses it as the clustered index. Define a primary key for each table that you create. If there is no logical unique and non-null column or set of columns, add a new auto-increment column, whose values are filled in automatically.

  • If you do not define a PRIMARY KEY for your table, MySQL locates the first UNIQUE index where all the key columns are NOT NULLand InnoDB uses it as the clustered index.

  • If the table has no PRIMARY KEY or suitable UNIQUE index, InnoDB internally generates a hidden clustered index namedGEN_CLUST_INDEX on a synthetic column containing row ID values. The rows are ordered by the ID that InnoDB assigns to the rows in such a table. The row ID is a 6-byte field that increases monotonically as new rows are inserted. Thus, the rows ordered by the row ID are physically in insertion order.

简单翻译一下:

在InnoDB中,每一张表都有一个特殊的索引:聚集索引(clustered index),表中的数据都会存储在这个索引中。一般来说,聚集索引就是主键。为了实现查询、插入等数据库操作的最佳性能,你必须理解InnoDB中聚集索引是如何对每张表的最常见的查找和数据操作进行优化的。

  • 如果一张表拥有主键,那么InnoDB就会用主键来做聚集索引。所以最好给每张表定义一个主键,即使这张表不具有逻辑上的主键甚至没有一个非空且唯一的字段,你也要添加一个自增的列。
  • 如果一张表没有定义主键,那么MySQL就会尝试寻找一个非空(NOT NULL)且唯一(UNIQUE)的字段作为聚集索引。
  • 如果一张表既没有主键,也没有非空且唯一的字段,InnoDB就会隐式地创建一个合成的列(synthetic column)来存储行ID,并且用该列创建名为GEN_CLUST_INDEX的聚集索引,表中的行会按照InnoDB分配的行ID的顺序进行存储。每当插入一个新行时就会一个6字节长的行ID,因此,所有的行都会按照出入顺序存储到硬盘上。

聚集索引如何提高查询速度?

MySQL中使用B+树做索引,然后在此基础上区分出聚集索引和非聚集索引。

聚集索引:主索引文件和数据文件为同一份文件,上图中的叶子节点上的data就是数据本身。

非聚集索引:主索引文件和数据文件是分离的,叶子节点存储的是数据存放的地址,所以非聚集索引比聚集索引多了一次读取数据的I/O操作,所以查找性能会相对差一些。

参考文献:

B-tree/b+tree 原理以及聚簇索引和非聚簇索引

MySQL中MyISAM与InnoDB的主要区别对比的更多相关文章

  1. MySQL中MyISAM和InnoDB两种主流存储引擎的特点

    一.数据库引擎(Engines)的概念 MySQ5.6L的架构图: MySQL的存储引擎全称为(Pluggable Storage Engines)插件式存储引擎.MySQL的所有逻辑概念,包括SQL ...

  2. 【mysql中myisam和innodb的区别】

    单击进入源网页 要点摘要: 1.查看mysql存储引擎的状态mysql> show engines; 2.查看mysql默认的存储引擎mysql> show variables like ...

  3. MYSQL 中 MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

    1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...

  4. MySQL中MyISAM和InnoDB的区别

    MyISAM和InnoDB的区别 MySQL默认采用的是MyISAM. MyISAM不支持事务,而InnoDB支持.InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事 ...

  5. MySQL中myisam与innodb的区别

    1.  myisam与innodb的5点不同 1>.InnoDB支持事物,而MyISAM不支持事物 2>.InnoDB支持行级锁,而MyISAM支持表级锁 3>.InnoDB支持MV ...

  6. MySQL中MyISAM与InnoDB区别及选择,mysql添加外键

    InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...

  7. PHP开发必用的mysql那么你知道Mysql中MyISAM和InnoDB的区别吗?

    构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). 索引文件的扩展名 ...

  8. MySQL中myisam和innodb的主键索引有什么区别?

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索 ...

  9. MySQL中MyISAM和InnoDB引擎的区别

    区别: 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事 ...

随机推荐

  1. 2017年11月23日**科技面试java工程师面试总结

    从整个面试看了,表现并不理想,有很多不足. 1.关于手机页面闪现问题的处理.从原理上观察,页面闪现是因为异步请求导致的.在进入页面中首先会加载默认的东西,此时也会访问数据库端,会用ajax判断是否满足 ...

  2. Angular2+ 编译后部署到服务器上页面刷新404问题

    原因:NG2+ 会默认不显示URL后面的文件名 解决方案:使用LocationStrategy方式,然后把URL后的# 替换成index.html# app.module.ts import {Has ...

  3. echarts x和y去掉

    解决方法 "axisLine": { "show": false },

  4. mysql开启远程登陆(修改数据表和授权两种方法)

    一.确认防火墙没有阻止3306端口(一般服务器默认会屏蔽掉) windows防火墙例外设置方法 控制面板(右上角选择查看方式为大图标)---防火墙---高级设置---高级设置---出站规则---最右边 ...

  5. Vue学习Day002

    内联处理器的操作 除了直接绑定到一个方法,也可以在内联JavaScript语句中调用方法 <div id="example-3"> <button v-on:cl ...

  6. mfc基于对话框的简单四则运算计算器

    1.①创建mfc对话框窗口,对话框中所有控件都delete. ②绘制界面,按键都button,显示区域edit control,计算器名字用static text. ③所有控件ID改成语义化ID(可不 ...

  7. 破解某PDF转换器产品

    本文章纯属出于作者自己对技术的探索,绝不用于商业用途(虽然网上已经能够下载到注册机了) 软件功能就不多说了,PDF转换成WORD格式,对于学生党来说也算是神器了吧,那么我们今天就用自己的办法来获得这款 ...

  8. Spark Streaming的容错和数据无丢失机制

    spark是迭代式的内存计算框架,具有很好的高可用性.sparkStreaming作为其模块之一,常被用于进行实时的流式计算.实时的流式处理系统必须是7*24运行的,同时可以从各种各样的系统错误中恢复 ...

  9. 实训任务05 MapReduce获取成绩表的最高分记录

    实训任务05  MapReduce获取成绩表的最高分记录 实训1:统计用户纺问次数 任务描述: 统计用户在2016年度每个自然日的总访问次数.原始数据文件中提供了用户名称与访问日期.这个任务就是要获取 ...

  10. MySQL data sync to Oracle with OGG(Remote Delivery)

    MySQL to Oracle with OGG 1. Install MySQL: yum install mysql-community-server [root@localhost ~]#  y ...