内容简介:在整理文章《Mysql 在设计时把表信息和数据是分开,这在注意:上文中突出了 Mysql8 以前,是因为 Mysql8 已经将 .frm .opt 之类的文件放入到了事务表中进行维护,目的是很明显的。
在整理文章《 Mysql索引的理解:B-Tree(B-树)和B+Tree(B+树) 》时,突然对 “MyISAM和InnoDB存储引擎区别” 有了一个新的理解: 两者之间区别之间是有很大关联性的 。后面我会慢慢说明。
构成上的区别
Mysql 在设计时把表信息和数据是分开,这在 Mysql8 以前表现为 .frm(表信息元数据)以及 xxx 文件。这是为什么是 xxx 文件,因为这里是本文整理的第一个区别。
索引和数据的存储结构区别
- MyISAM 将索引和数据分别保存在 .MYI(索引) 和 .MYD(数据) 中
- InnoDB 则将索引和数据保存在了相同的文件 .ibd 或者 ibdata 中,.ibd 看似是 ibdata 的缩写,但其它含义是不一样,首先,.ibd 我用了 “.” 表示后缀的意思,但是 ibdata 并没有;其次,.ibd 是独享表空间,ibdata 是共享表空间,可通过 innodb_file_per_table 来修改。
注意:上文中突出了 Mysql 8 以前,是因为 Mysql8 已经将 .frm .opt 之类的文件放入到了事务表中进行维护,目的是很明显的。
上文说到了,MyISAM 存储引擎把索引和数据分开存放,但是在实际使用过程它俩是无法分开的,因为通过索引要能找到数据,这里是本文整理的第二个区别。
索引实现区别
- 首先,二者都是使用 B+ tree 实现的,但是在叶子结点中存储的数据是不一样的,MyISAM 存储的是数据行的地址,而 InnoDB 不一定,为什么说不一定,看下一条;
- MyISAM 索引和数据分开,所以它的索引都是存储的数据行地址,但是 InnoDB 不同,对于主键,它存储的是整个数据,而辅助索引存储的是主键ID,这里引申出下一条;
- InnoDB 必需有主键,当然,你可以说你不创建,但是引擎会默认给你加上一个 6 字节的隐藏主键, 建议开发者明确指定 InnoDB 表主键 ;
- 怎么记索引实现区别,两个词: “聚集”、“非聚集” 。
可移植性、备份及恢复
- MyISAM 数据文件可被压缩,存储空间较小。备份恢复可拷贝文件;
- InnoDB 也可以拷贝文件,但是数据量大时就麻烦;
-
都可 mysqldump 和 binlog。
MyISAM 支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
事务及外键
- MyISAM 不支持事务和外键;
- InnoDB 支持事务和外键。
表锁差异
- MyISAM 只支持表级锁,用户在操作 MyISAM 表时,select,update,delete,insert 语句都会给表自动加锁,如果加锁以后的表满足 insert 并发的情况下,可以在表的尾部插入新的数据。
- InnoDB 支持事务和行级锁,是 InnoDB 的最大特色。行锁大幅度提高了多用户并发操作的新能。但是 InnoDB的行锁,只是在 WHERE 的主键是有效的,非主键的 WHERE 都会锁全表的。
全文索引
- MyISAM 支持 FULLTEXT 类型的全文索引
- InnoDB 不支持 FULLTEXT 类型的全文索引,但是 InnoDB 可以使用 sphinx 插件支持全文索引,并且效果更好。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript高级程序设计:第2版
Nicholas Zakas / 李松峰、曹力 / 人民邮电出版社 / 2010-7 / 89.00元
《JavaScript高级程序设计(第2版)》在上一版基础上进行了大幅度更新和修订,融入了近几年来JavaScript应用发展的最新成果,几乎涵盖了所有需要理解的重要概念和最新的JavaScript应用成果。从颇具深度的JavaScript语言基础到作用域(链),从引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(BOM)、文档对象模型(DOM)到基于事件的Web脚本......一起来看看 《JavaScript高级程序设计:第2版》 这本书的介绍吧!