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存储引擎相关推荐

  1. MySQL的MyISAM和InnoDB存储引擎表结构

    MySQL的MyISAM和InnoDB存储引擎表结构: MyISAM存储引擎: MyISAM表:每一个表都有3个文件,都位于数据库目录中. tb_name.frm 表结构定义 tb_name.MYD ...

  2. MyISAM和InnoDB存储引擎的特点

    Mysql区别于其他数据库的一个重要特点是其插件式的表存储引擎,注意,存储引擎是基于表的,而不是基于数据库. MyISAM 特性 不支持事务:MyISAM存储引擎不支持事务,所以对事务有要求的业务场景 ...

  3. innodb和my查询速度_吃透MySQL:MyISAM和InnoDB存储引擎详细介绍

    一,MySQL基本架构 MySQL基础架构可以分为两大类:Server层和存储引擎层. Server层: Server层涵盖了MySQL大部分核心业务功能,并且所有存储引擎的功能都在这一层实现. 存储 ...

  4. MySQL数据库中的MyISAM和InnoDB存储引擎对比

    一.InnoDB和MylSAM存储引擎对比 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访 ...

  5. MySQL MyISAM和InnoDB存储引擎的比较

    MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索,但不是事务安全的,而且不支持外键.每张MyISAM表存放在三个文件中:frm 文件存放表格定义:数据文件是MYD (MYD ...

  6. MySQL管理之 MyISAM和InnoDB存储引擎简单对比

    有 一.MyISAM引擎: 1.隔离事务界别: 由于myisam的隔离事务级别是串行.采用的是表级锁,不支持事物和全文索引.因此不适用在大并发,重负荷的生产系统上. 2.实例的崩溃恢复: 当系统宕机或 ...

  7. MySQL数据库MyISAM和InnoDB存储引擎的比较

    MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种.这里介绍关于这两种引擎的一些基本概念(非深入介绍). MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索 ...

  8. MySQL InnoDB 存储引擎索引那些事儿

    InnoDB 存储引擎中,表是根据主键顺序组织存放的,称为索引组织表.每个表都有一个主键,如果没有显示定义主键,则会选择第一个创建的非空唯一索引作为主键,如果没有非空唯一索引,InnoDB引擎则自动创 ...

  9. 为什么MySQL InnoDB 存储引擎要用B+树做索引,而不用B树?

    为什么MySQL InnoDB 存储引擎 要用B+树做索引,而不用B树? (1)B+树空间利用率更高,可减少I/O次数 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存 ...

最新文章

  1. boost::function_types::is_member_function_pointer的用法测试程序
  2. android apt最新版本,解决Android studio 2.3升级到Android studio 3.0 后apt报错问题
  3. Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
  4. Tomcat的安装及配置。
  5. VMware 修复 Workstation、Fusion 中多个严重的代码执行漏洞
  6. life words
  7. 解析Java的JNI编程中的对象引用与内存泄漏问题
  8. qt调试失败问题跟踪
  9. paip.软件版本完善计划VC421
  10. PID系统稳定性与零极点的关系
  11. 如何查看一个网站的robots文件?
  12. 简明理解 行列式和秩
  13. tl r4238 虚拟服务器,TL-R4238快速安装设置指南图文教程
  14. Excel_软件介绍
  15. 内存管理中的 RSS 和 VSZ意思
  16. 解决 Nacos 服务注册使用 Docker 容器内网 ip 问题
  17. 【计算机图形学】零 · 计算机图形系统概述
  18. python猜拳if判断语句_python使用if语句实现一个猜拳游戏详解
  19. 浏览器缓存机制(吴秦(Tyler) )
  20. 就任北京大学校长之演说

热门文章

  1. qt add qrc - Files are not automatically added to the CMakeLists.txt
  2. 32岁医生放弃医院编制,转行去做程序员!
  3. 关于接口测试--面试题
  4. garch dcc用matlab,MRS DCC GARCH 模型的MATLAB 程序修改
  5. Altium Designer 导入PCB库
  6. 手把手教你制作微信小程序,开源、免费、快速搞定
  7. Entity Framework使用DBContext实现增删改查示例
  8. 如何设置自定义任务栏图标_轻松自定义Windows 7任务栏图标
  9. 图论中握手定理的详细解释
  10. html js表单,HTML HTML 表单 - 闪电教程JSRUN