MyISAM与InnoDB存储引擎
MyISAM存储引擎
- MyISAM索引文件和数据文件是分离的(非聚集)
CREATE TABLE `test_myisam` (`clo1` int(11) NOT NULL AUTO_INCREMENT,`clo2` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
创建一个MyISAM存储引擎的表,表在磁盘上的存储文件如下
增加clo1字段索引,查询clo1=30存储引擎执行流程如下:
- ① 首先在索引(MYI)中找到索引值=30的索引数据
- ② 取索引数据中的磁盘地址,这个磁盘地址是clo=30这行数据在磁盘的数据行地址
- ③ 到数据文件(MYD)中取出当前行数据
InnoDB存储引擎(主键索引-聚集)
- 表数据文件本身就是按照B+Tree组织的一个索引文件
- InnoDB建议表使用整型的自增主键
- 非主键索引结构的叶子节点存储的是主键值
CREATE TABLE `test_innodb` (`clo1` int(11) NOT NULL AUTO_INCREMENT,`clo2` varchar(255) DEFAULT NULL,`clo3` varchar(255) DEFAULT NULL,PRIMARY KEY (`clo1`) USING BTREE,KEY `indx_clo3` (`clo3`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
创建一个InnoDB存储引擎的表,设置clo1为自增主键,clo3字段加索引,在磁盘的存储文件如下:
InnoDB存储引擎的索引存储分为两种,主键索引和非主键索引
主键索引:主键索引叶子节点data里面存的是这一数据行的所有数据。
根据主键查询数据时,从根节点开始load到内存进行比对,直到在叶子节点找到这行数据。
非主键索引:叶子节点data里面存的数据是主键值
非主键索引查询与主键索引查询略有不同,涉及到回表操作。流程如下:
- ① 在ibd文件中找到clo3的索引数据,找到James所在叶子节点,拿到data里面的主键值
- ② 再次到ibd文件中使用主键索引数据查找值为08的数据行,这一步就叫做回表
为什么这么做,主要有两点原因:
- ① 保持数据的一致性,在修改数据的时候只需要修改主键索引下的数据即可,如果非主键索引也存储数据,可能会出现主键索引下的数据修改成功,非主键索引下的数据修改不成功,导致数据不一致。
- ② 节省空间,在主键索引下存储一份数据,在非主键索引下在存一份数据,这两个数据是一样的,存储两份浪费磁盘空间。
聚集索引:叶子节点包含了完整的数据记录(InnoDB的主键索引),查询的速度会更快,不用跨文件和回表查询。
非聚集索引:索引和数据分开存储的索引(MySIAM索引)
为什么InnoDB建议,建表时要创建一个整型的自增主键?
1.要创建主键
ibd文件存储数据必须要用一个B+Tree来组织存储,如果有主键就可以用主键来组织数据存储,如果没有主键会从表的第一列开始,找一个字段值都不相同的列来组织存储,如果找不到,MySQL会帮助创建一个隐藏列类似于rowid,会维护一个唯一的id来组织存储。
MySQL资源很宝贵,组织数据存储通过简单的主键来实现,没必要浪费MySQL的资源。
2.整型
①在查询的过程中要把数据load到内存中进行比较,不是整型数据,比如varchar类型的数据进行比较的时候要一个字符一个字符的比较,还得使用ASCII码进行比较,如果是两个整型的数据,直接进行对比,整型数据要比非整型数据效率高。
② 整型比字符串UUID节省空间。
3.自增
如上例子非自增的id在往6和8之间新增一个7时要在5-6-8这一数据页6和8之间增加一个7,然后在进行分裂,再做一次平衡,如果是自增的直接在后面追加后再进行分裂。
假设7在中间位置加的时候,为了保证有序性,后面的数据页可能会受到分裂影响重新做分配和平衡,如果是有序的只需要追加就可以了,不用考虑前面的分裂对后面数据的影响。
联合主键索引
CREATE TABLE `t` (`name` varchar(255) COLLATE utf8mb4_bin NOT NULL,`age` int(11) NOT NULL,`position` varchar(255) COLLATE utf8mb4_bin NOT NULL,`yearmonth` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,PRIMARY KEY (`name`,`age`,`position`),KEY `ide_name_age_position` (`name`,`age`,`position`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
使用MySQL执行计划看一下,什么样的查询会使联合索引生效
EXPLAIN SELECT * from t WHERE name='HName' AND age = '30';
EXPLAIN SELECT * from t WHERE age = '30' and position = 'dev';
EXPLAIN SELECT * from t WHERE position = 'dev';
EXPLAIN SELECT * from t WHERE age = '28' and name='HName';
只有第一条数据和第四条走了联合索引,原因是索引的左前缀原理:查询条件必须包含索引列里面最左侧的字段,索引才不会失效。
原因如下:
在这个索引数里面查找出age=30的数据行,这个索引树是优先通过name排序的,所以在第一个叶子节点中有,在第三个叶子节点中也有,如果要找全,就需要全盘扫描。
我要查询出name=AName的数据就不一样了,只需要拿出第一个叶子节点就可以了。
MyISAM与InnoDB存储引擎相关推荐
- MySQL的MyISAM和InnoDB存储引擎表结构
MySQL的MyISAM和InnoDB存储引擎表结构: MyISAM存储引擎: MyISAM表:每一个表都有3个文件,都位于数据库目录中. tb_name.frm 表结构定义 tb_name.MYD ...
- MyISAM和InnoDB存储引擎的特点
Mysql区别于其他数据库的一个重要特点是其插件式的表存储引擎,注意,存储引擎是基于表的,而不是基于数据库. MyISAM 特性 不支持事务:MyISAM存储引擎不支持事务,所以对事务有要求的业务场景 ...
- innodb和my查询速度_吃透MySQL:MyISAM和InnoDB存储引擎详细介绍
一,MySQL基本架构 MySQL基础架构可以分为两大类:Server层和存储引擎层. Server层: Server层涵盖了MySQL大部分核心业务功能,并且所有存储引擎的功能都在这一层实现. 存储 ...
- MySQL数据库中的MyISAM和InnoDB存储引擎对比
一.InnoDB和MylSAM存储引擎对比 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访 ...
- MySQL MyISAM和InnoDB存储引擎的比较
MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索,但不是事务安全的,而且不支持外键.每张MyISAM表存放在三个文件中:frm 文件存放表格定义:数据文件是MYD (MYD ...
- MySQL管理之 MyISAM和InnoDB存储引擎简单对比
有 一.MyISAM引擎: 1.隔离事务界别: 由于myisam的隔离事务级别是串行.采用的是表级锁,不支持事物和全文索引.因此不适用在大并发,重负荷的生产系统上. 2.实例的崩溃恢复: 当系统宕机或 ...
- MySQL数据库MyISAM和InnoDB存储引擎的比较
MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种.这里介绍关于这两种引擎的一些基本概念(非深入介绍). MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索 ...
- MySQL InnoDB 存储引擎索引那些事儿
InnoDB 存储引擎中,表是根据主键顺序组织存放的,称为索引组织表.每个表都有一个主键,如果没有显示定义主键,则会选择第一个创建的非空唯一索引作为主键,如果没有非空唯一索引,InnoDB引擎则自动创 ...
- 为什么MySQL InnoDB 存储引擎要用B+树做索引,而不用B树?
为什么MySQL InnoDB 存储引擎 要用B+树做索引,而不用B树? (1)B+树空间利用率更高,可减少I/O次数 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存 ...
最新文章
- boost::function_types::is_member_function_pointer的用法测试程序
- android apt最新版本,解决Android studio 2.3升级到Android studio 3.0 后apt报错问题
- Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
- Tomcat的安装及配置。
- VMware 修复 Workstation、Fusion 中多个严重的代码执行漏洞
- life words
- 解析Java的JNI编程中的对象引用与内存泄漏问题
- qt调试失败问题跟踪
- paip.软件版本完善计划VC421
- PID系统稳定性与零极点的关系
- 如何查看一个网站的robots文件?
- 简明理解 行列式和秩
- tl r4238 虚拟服务器,TL-R4238快速安装设置指南图文教程
- Excel_软件介绍
- 内存管理中的 RSS 和 VSZ意思
- 解决 Nacos 服务注册使用 Docker 容器内网 ip 问题
- 【计算机图形学】零 · 计算机图形系统概述
- python猜拳if判断语句_python使用if语句实现一个猜拳游戏详解
- 浏览器缓存机制(吴秦(Tyler) )
- 就任北京大学校长之演说
热门文章
- qt add qrc - Files are not automatically added to the CMakeLists.txt
- 32岁医生放弃医院编制,转行去做程序员!
- 关于接口测试--面试题
- garch dcc用matlab,MRS DCC GARCH 模型的MATLAB 程序修改
- Altium Designer 导入PCB库
- 手把手教你制作微信小程序,开源、免费、快速搞定
- Entity Framework使用DBContext实现增删改查示例
- 如何设置自定义任务栏图标_轻松自定义Windows 7任务栏图标
- 图论中握手定理的详细解释
- html js表单,HTML HTML 表单 - 闪电教程JSRUN