一 InnoDB和MyISAM存储方式

聚簇 VS 非聚簇

InnoDB采用聚簇索引的方式存储数据,即主键索引(若没有设置unique索引则InnoDB会默认给主键创建索引)和数据一起存储,或者说,表中的数据是在内存中是按照主键索引的递增顺序组织存储的。对于InnoDB,一条sql如果筛选条件中主键索引成功生效并且返回字段就是索引字段,则InnoDB会直接查询数据文件,在叶子节点即可拿到数据。

而MyISAM则采用了非聚簇索引的方式,将原始数据和索引(任何)分为不同的文件独立存储,一条sql不管筛选条件利用了什么索引,MyISAM都要先查索引文件,再回数据文件相应位置取数据。

为了更加深入理解,想一下InnoDB下为一张表添加索引(非主键索引),此时这个索引文件必然是单独存储的,此时索引和数据就是独立存储的。一般情况下,一条sql如果筛选条件成功让索引生效,则InnoDB会先查索引文件,拿到该符合条件记录的id(主键)后,根据id再回数据文件进行一次select where id = xxx。

但是,如果建立的是组合索引(叶子节点不仅有id,还有组合索引的这几列数据),查询也成功地进行了覆盖查询,则直接拿着叶子上的列值返回,不用回主表查询了。

这里也可以看到,InnoDB的索引的B+树的叶子上存储的是该条件下的记录在主数据文件中的内存地址,而InnoDB索引的B+树叶子上存储的要么是完整记录行(主键索引),要么建立该索引使用的列值+主键id(这也提示我们不能InnoDB下不能加你个主键设置得过大)。

上面说的只是逻辑上的概念,实际在实现中,MyISAM有三个文件:表结构定义文件,数据文件,索引文件。

MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。

InnoDB要分情况讨论,表结构定义文件 + 数据索引文件

二 主键,外键

InnoDB必须要有主键,MyISAM可以没有,理由也很清楚:InnoDB的数据必须要按照主键索引组织存储,InnoDB下如果没有设定主键或者非空唯一索引,其会自动生成一个6字节的主键(用户不可见)。

前者支持外键,后者不支持。

三 事务,锁粒度

InnoDB支持外键,事务,支持行级锁(默认锁级别),MyISAM不支持外键,事务,只支持表级锁。

四 数据压缩,count

对于只读的表,MyISAM可以使用myisam命令进行数据压缩,更加节省空间;专门的变量存储当前表的记录数目,即count (*)是常数级别的,这两点InnoDB都没有,count(*)要扫描全表。

五 并发场景下怎么选择

先给结论:select和update时,MyISAM更快。

MySQL 中 MyISAM 中的查询为什么比 InnoDB 快

总结一下即;

① 非主键索引时,InnoDB要走2次B+树,MyISAM只有一次。

② 查询InnoDB的主表(不管使用的索引是不是主键索引,最后一步都要回主表,走主键索引),必须要进行大量的I/O将磁盘中的数据调入内存

而对于这两点,MyISAM都不存在,由于索引和文件是独立存储的,不管利用了什么索引,MyISAM只需要先查索引文件(很小,一次性调用内存),找到叶子上对应的物理地址后,去数据文件中拿数据即可。可以说,总是常数级别的。

如果更加深入地理解这一点,看下图:

参考资料:like索引查询--mysql索引

即InnoDB下,对于MySQL的主键索引而言,从根到叶子路径上的每个节点都是一个16K大小的数据页,需要进行树高大小的磁盘I/O,注意,因为MySQL使用的是聚簇索引,意味着无论使用主键索引还是其他索引进行查找时,最后都必然要走这个过程。

而MyISAM索引类似于InnoDB下非主键索引查找的第一阶段,仅仅需要查找索引B+树即可,由于叶子上没有多少数据,甚至可以一次性将索引调入内存进行查找(一次磁盘I/O),而不像MySQL一样由于数据页固定大小——16K,所以必然要多次I/O。

InnoDB要维护MVCC,虽然select不用维护主键和B+树,但是对于每一行的是否符合条件的判断时都要检查MVCC的创建版本号和删除版本号,至少保证:

A.当前事务的版本号 > 该行的创建版本号——该行已经被创建,并且被其他事务修改;

B.当前事务的版本号 < 该行的删除版本号——操作时,该行还未被删除。

很明显,这些原因会导致InnoDB会MyISAM查询慢。

这也引出一个应用场景,在做读写分离时,InnoDB做主服务器,负责写,读可以负责也可以不负责;MyISAM作从服务器,只负责读。

那么至于update呢?

????

六 Memory引擎

高性能MySQL(3th)(第一章 MySQL概述) —— 04 InnoDB和MyISAM相关推荐

  1. 关于高性能mysql的读书报告_《高性能MySQL》读书笔记:第一章[MySQL架构与历史]...

    <高性能MySQL>读书笔记:第一章[MySQL架构与历史] MySQL逻辑架构 MySQL最优秀的一点就是它的存储架构,将查询处理,系统任务,数据存储/提取相分离 并发控制 通过读写锁实 ...

  2. 第一章 MongoDb概述

    版本修改历史 版本 修改内容 修改人 日期 1.0 创建文档 李乐 2010-6-30 第一章 MongoDb概述 集文档数据库,键值对存储和关系型数据库的优点于一身. MongoDB (名称来自&q ...

  3. IT项目管理总结:第一章 项目管理概述

    第一章 项目管理概述 使用项目管理的好处 –更好地控制财力.物力和人力资源 –改进客户关系 –缩短开发时间 –降低成本和提高生产率 –提高质量和可靠性 –更大的边际利润空间 –更好的内部协调 –积极影 ...

  4. 计算机网络(谢希仁第八版)第一章:概述

    1.计算机网络在信息时代的作用 三网:电信网络,有线电视网络,计算机网络. 三网融合:由于涉及多方面的利益和行政管辖权的问题,目前没有实现. Internet(译名:因特网,目前使用最广泛的译名为:互 ...

  5. 编写高性能 .NET 代码 第一章:工具介绍 -- Performance Counters(性能计数器)

    Performance Counters(性能计数器) 性能计数器是监视应用程序和系统性能的最简单的方法之一.它有几十个类别数百个计数器在,包括一些.net特有的计数器.要访问这些可以通过系统自带的 ...

  6. [翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Visual Studio

    Visual Studio vs虽然不是全宇宙唯一的IDE,但它是.net开发人员最常用的开发工具.它自带一个性能分析工具,你可以使用它来做开发,不同的vs版本在工具上会略有差别. VS可以分析CPU ...

  7. [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 平均值 vs 百分比

    平均值 vs 百分比 在考虑要性能测试的目标值时,我们需要考虑用什么统计口径.大多数人都会首选平均值,但在大多数情况下,这个正确的,但你也应该适当的考虑百分数.但你有可用性的要求,作为性能测试的目标里 ...

  8. 【JUC】第一章 JUC概述、Lock 接口

    第一章 JUC 概述.Lock 接口 文章目录 第一章 JUC 概述.Lock 接口 一.JUC 概述 1.什么是 JUC 2.线程和进程概念 3.线程的状态 4.并发与并行 5.管程 6.用户线程和 ...

  9. Java极速入门系列:第一章Java概述、Java环境、IDEA开发工具

    Java极速入门-第一章Java概述.Java环境.IDEA开发工具 一.什么是Java 1.好的编程语言的特性 2.Java的特点 3.Java的运行机制 4.Java的三大体系 5.Java环境 ...

  10. 第一章 分布式计算概述

    第一章 分布式计算概述 一.分布式计算的概念 分布式计算是计算机科学的重要研究内容,主要研究对象是分布式系统.简单地说,一个分布式系统是由若干通过网络互连的计算机组成的软硬件系统,且这些计算机互相配合 ...

最新文章

  1. 在html页面中引入公共的头部和底部
  2. 前馈神经网络中的前馈_前馈神经网络在基于趋势的交易中的有效性(1)
  3. 牛客 - 17968 - xor序列 - 线性基
  4. 5招详解linux之openEuler /centos7防火墙基本使用指南
  5. js未知数加已知数的结果数,三者的每个数字不重复
  6. python人口普查数据数据分析_美国人口普查数据可视化探索和收入水平预测建模...
  7. eclipse加载jdbc驱动(mysql)
  8. WM6电话簿转到Android系统
  9. 照片视频制作软件哪个好?自动生成酷炫效果,3步快速搞定!
  10. 数学期望方差 expectationvariance
  11. 带有H5标签的字符串
  12. 100句话记住7000个单词。
  13. 技术干货 | 如何用MindSpore优化器加速收敛高度逼近最优值?
  14. Centos7 在docker中安装Mysql 8.0 的相关问题
  15. Android Calander Event
  16. oracle 数据库中order by 的一些高级用法
  17. module.exports 和 exports的区别
  18. 小波分析——1. 初识小波分析
  19. Matlab中遇到~=
  20. 【mysql】查询某一年 某一月 某一天的数据

热门文章

  1. C++signed 与unsigned理解
  2. 期货十三篇 第七篇 平仓篇
  3. 日期计算(一个日期是本年的第几天)
  4. 景区怎么防止年票卡多人使用?
  5. 地图信息,障碍判断以及寻路算法(A星算法,B星算法和蚁群算法等)
  6. doc转pdf java不失真,java doc转PDF
  7. 远程桌面工具 mRemote
  8. siki学院 游戏热更新实战案例(基于xLua) 捕鱼达人 完整素材
  9. 原生js实现歌词滚动以及卡拉OK效果
  10. 牛客寒假算法基础集训营6补题和题解