高性能MySQL(3th)(第一章 MySQL概述) —— 04 InnoDB和MyISAM
一 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相关推荐
- 关于高性能mysql的读书报告_《高性能MySQL》读书笔记:第一章[MySQL架构与历史]...
<高性能MySQL>读书笔记:第一章[MySQL架构与历史] MySQL逻辑架构 MySQL最优秀的一点就是它的存储架构,将查询处理,系统任务,数据存储/提取相分离 并发控制 通过读写锁实 ...
- 第一章 MongoDb概述
版本修改历史 版本 修改内容 修改人 日期 1.0 创建文档 李乐 2010-6-30 第一章 MongoDb概述 集文档数据库,键值对存储和关系型数据库的优点于一身. MongoDB (名称来自&q ...
- IT项目管理总结:第一章 项目管理概述
第一章 项目管理概述 使用项目管理的好处 –更好地控制财力.物力和人力资源 –改进客户关系 –缩短开发时间 –降低成本和提高生产率 –提高质量和可靠性 –更大的边际利润空间 –更好的内部协调 –积极影 ...
- 计算机网络(谢希仁第八版)第一章:概述
1.计算机网络在信息时代的作用 三网:电信网络,有线电视网络,计算机网络. 三网融合:由于涉及多方面的利益和行政管辖权的问题,目前没有实现. Internet(译名:因特网,目前使用最广泛的译名为:互 ...
- 编写高性能 .NET 代码 第一章:工具介绍 -- Performance Counters(性能计数器)
Performance Counters(性能计数器) 性能计数器是监视应用程序和系统性能的最简单的方法之一.它有几十个类别数百个计数器在,包括一些.net特有的计数器.要访问这些可以通过系统自带的 ...
- [翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Visual Studio
Visual Studio vs虽然不是全宇宙唯一的IDE,但它是.net开发人员最常用的开发工具.它自带一个性能分析工具,你可以使用它来做开发,不同的vs版本在工具上会略有差别. VS可以分析CPU ...
- [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 平均值 vs 百分比
平均值 vs 百分比 在考虑要性能测试的目标值时,我们需要考虑用什么统计口径.大多数人都会首选平均值,但在大多数情况下,这个正确的,但你也应该适当的考虑百分数.但你有可用性的要求,作为性能测试的目标里 ...
- 【JUC】第一章 JUC概述、Lock 接口
第一章 JUC 概述.Lock 接口 文章目录 第一章 JUC 概述.Lock 接口 一.JUC 概述 1.什么是 JUC 2.线程和进程概念 3.线程的状态 4.并发与并行 5.管程 6.用户线程和 ...
- Java极速入门系列:第一章Java概述、Java环境、IDEA开发工具
Java极速入门-第一章Java概述.Java环境.IDEA开发工具 一.什么是Java 1.好的编程语言的特性 2.Java的特点 3.Java的运行机制 4.Java的三大体系 5.Java环境 ...
- 第一章 分布式计算概述
第一章 分布式计算概述 一.分布式计算的概念 分布式计算是计算机科学的重要研究内容,主要研究对象是分布式系统.简单地说,一个分布式系统是由若干通过网络互连的计算机组成的软硬件系统,且这些计算机互相配合 ...
最新文章
- 在html页面中引入公共的头部和底部
- 前馈神经网络中的前馈_前馈神经网络在基于趋势的交易中的有效性(1)
- 牛客 - 17968 - xor序列 - 线性基
- 5招详解linux之openEuler /centos7防火墙基本使用指南
- js未知数加已知数的结果数,三者的每个数字不重复
- python人口普查数据数据分析_美国人口普查数据可视化探索和收入水平预测建模...
- eclipse加载jdbc驱动(mysql)
- WM6电话簿转到Android系统
- 照片视频制作软件哪个好?自动生成酷炫效果,3步快速搞定!
- 数学期望方差 expectationvariance
- 带有H5标签的字符串
- 100句话记住7000个单词。
- 技术干货 | 如何用MindSpore优化器加速收敛高度逼近最优值?
- Centos7 在docker中安装Mysql 8.0 的相关问题
- Android Calander Event
- oracle 数据库中order by 的一些高级用法
- module.exports 和 exports的区别
- 小波分析——1. 初识小波分析
- Matlab中遇到~=
- 【mysql】查询某一年 某一月 某一天的数据