MySQL中MyISAM与InnoDB的主要区别对比
| 特征 | 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 KEYon your table,InnoDBuses 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 KEYfor your table, MySQL locates the firstUNIQUEindex where all the key columns areNOT NULLandInnoDBuses it as the clustered index.If the table has no
PRIMARY KEYor suitableUNIQUEindex,InnoDBinternally generates a hidden clustered index namedGEN_CLUST_INDEXon a synthetic column containing row ID values. The rows are ordered by the ID thatInnoDBassigns 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操作,所以查找性能会相对差一些。
参考文献:
MySQL中MyISAM与InnoDB的主要区别对比的更多相关文章
- MySQL中MyISAM和InnoDB两种主流存储引擎的特点
一.数据库引擎(Engines)的概念 MySQ5.6L的架构图: MySQL的存储引擎全称为(Pluggable Storage Engines)插件式存储引擎.MySQL的所有逻辑概念,包括SQL ...
- 【mysql中myisam和innodb的区别】
单击进入源网页 要点摘要: 1.查看mysql存储引擎的状态mysql> show engines; 2.查看mysql默认的存储引擎mysql> show variables like ...
- MYSQL 中 MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比
1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...
- MySQL中MyISAM和InnoDB的区别
MyISAM和InnoDB的区别 MySQL默认采用的是MyISAM. MyISAM不支持事务,而InnoDB支持.InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事 ...
- MySQL中myisam与innodb的区别
1. myisam与innodb的5点不同 1>.InnoDB支持事物,而MyISAM不支持事物 2>.InnoDB支持行级锁,而MyISAM支持表级锁 3>.InnoDB支持MV ...
- MySQL中MyISAM与InnoDB区别及选择,mysql添加外键
InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...
- PHP开发必用的mysql那么你知道Mysql中MyISAM和InnoDB的区别吗?
构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). 索引文件的扩展名 ...
- MySQL中myisam和innodb的主键索引有什么区别?
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索 ...
- MySQL中MyISAM和InnoDB引擎的区别
区别: 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事 ...
随机推荐
- 使用 ZipArchive 生成Zip文件备注
近两日研究了Abp.io 中模板项目的生成原理,是从Github下载源码包,进行修改.替换,然后生成新的zip包提供下载. 项目内部使用了 这个包 Ionic.Zip Version=" ...
- Tensorflow安装指南
1.关闭所有安全工具!!!!!(非常重要!否则很可能安装失败) 2.下载CUDA 地址https://developer.nvidia.com/accelerated-computing-toolki ...
- Https 单向验证 双向验证
通讯原理 participant Client participant Server Client->>Server: 以明文传输数据,主要有客户端支持的SSL版本等客户端支持的加密信息 ...
- python 进程池Pool的apply_async方法以及一些需要注意的地方
在写多进程的时候我发现一个问题,用Pool的apply_async(异步非阻塞)的时候传入实例函数会出错,或者说是子进程被跳过似的感觉(python2.7). 但是用python3.7的话没有任何问题 ...
- LeetCode算法历程-01
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...
- 第九次作业——K-means算法应用:图片压缩
一.读取一张示例图片或自己准备的图片,观察图片存放数据特点. 根据图片的分辨率,可适当降低分辨率. 再用k均值聚类算法,将图片中所有的颜色值做聚类. 然后用聚类中心的颜色代替原来的颜色值. 形成新的图 ...
- ffmpeg使用示例
/* 视频格式转换 ffmpeg -i "F:\Test\1.mp4" -y -vcodec copy -acodec copy "F:\Test\11.avi" ...
- sse矩阵乘法 应该是1毫秒纯运算1000次
#include <intrin.h> #include <math.h> struct Vector4 { float x, y, z, w; }; struct Matri ...
- angular4 富文本编辑器
使用quill富文本编辑器实现,angular项目中用到了ngx-quill插件. quill的GitHub地址:https://github.com/quilljs/quill ngx-quill的 ...
- RedLock.Net - 基于Redis分布式锁的开源实现
工作中,经常会遇到分布式环境中资源访问冲突问题,比如商城的库存数量处理,或者某个事件的原子性操作,都需要确保某个时间段内只有一个线程在访问或处理资源. 因此现在网上也有很多的分布式锁的解决方案,有数据 ...