Mysql 的Innodb引擎和Myisam数据结构和区别

先大体看一下MySQL的SQL layer层的一个架构流程:

Mysql 的Innodb引擎和Myisam数据结构和区别

简要介绍一些关键模块:

[En]

Give a brief description of some key modules:

  1. 初始模块:初始一些参数,比如初始myinit配置文件(在安装的根目录下)里的一些参数。

  2. 连接管理模块:启动监听,监听连接请求

  3. 连接进程模块:可以理解为线程池

  4. 用户模块:检验用户,令牌和权限

  5. 命令分发器:处理不同类型的请求

  6. 查询缓存模块:做缓存处理,做查询的cache,可以理解为一个Map,查询语句为key,结果值为value

  7. 日志记录模块

  8. 命令解析器(parser):对于不同类型的sql语句进行处理分发,select:查询优化器,dml:表变更模块,ddl:表维护模块,rep:复制模块(主从复制),status:状态模块。

  9. 访问控制:

  10. 表管理模块:

  11. 存储引擎接口:和Storage Engines打交道

直接来到Storage Engines,这讲的最多的就是引擎了,如:

Myisam、Innodb、Faicon、Memory、Archive等等引擎

而我们常用的是Innodb和Myisam这两种,这两种索引最直接的区别,可以从采用对应引擎而生成的数据表文件,进行对比。比如:采用Innodb引擎生成表A,采用Myisam索引生成表B。

现在可以从Mysql安装目录/data/数据库名 ,这个目录下看到有5个文件:

A.frm : 表定义文件

A.ibd :数据和索引都存储在这个文件

B.frm :表定义文件

B.myd :数据文件

B.myi :索引文件

显然,两者从文件上体验出来的区别就是,Myisam是把数据和索引分开存储在两个不同的文件里。(那其本质里的区别是什么?急啥)

让我们来看看,衡量一个指数的标准是什么?

[En]

Let’s see, what are the criteria for measuring an index?

就是,IO渐进复杂度,翻译成人话就是:当数据越来越多的时候,索引是否依然高效,即查询依然那么快。

索引的效率在一定程度上取决于它使用的索引结构。

[En]

The efficiency of an index depends to some extent on the index structure it uses.

Hash索引:

对索引字段做Hash计算,落到不同槽里面,有个明显的缺点是,无法做范围查询,例如 select * from data where id >1

Fulltext索引:

全文搜索索引,比如字段的值是:abcdefghijk,它就会再生成一列abcde* ,用于前缀的模糊全文搜索。

R-Tree索引:

引用的场景主要是 空间索引,比如说,美团上订电影票,就可以选择3km范围内的影院,结果就搜出来了。

B-Tree索引:

这个索引就是我要重点讲的索引,因为Innodb和Myisam采用的是B+ Tree 索引,而B+ Tree是从B-Tree基础上演变而来。

那B-Tree是怎么样的呢?如图:

Mysql 的Innodb引擎和Myisam数据结构和区别

每个节点上有一个索引(上方的数字,id的值),和索引对应的数据(下方蓝色:id, name)

而B+Tree:

Mysql 的Innodb引擎和Myisam数据结构和区别

上方白色的数字都为索引的key,而data全放在下面。(居于此结构,如果想知道它是怎么根据key从上到下找到对应的data的,我提供一个非常好玩的web工具,去玩一下琢磨一下。https://www.cs.usfca.edu/~galles/visualization/Algorithms.html)

虽然Innodb和Myisam都是采用B+Tree索引,但是它们是有区别的,如图:

Mysql 的Innodb引擎和Myisam数据结构和区别

Mysql 的Innodb引擎和Myisam数据结构和区别

前面已经说了,Myisam引擎方式的,会把索引和数据分开存储在两个文件中,一个文件负责数据的插入、更新等,另一个负责索引的维护。如图,索引中白色的key为索引的值,下面浅绿色为data:对应数据的地址。如果多个索引就,就多个这种模式,如图,以name为索引,也是一样。

而Innodb:如图:

Mysql 的Innodb引擎和Myisam数据结构和区别

Mysql 的Innodb引擎和Myisam数据结构和区别

上面也提到,Innodb是把数据和索引都放在同一个文件里的,那索引和数据共存的形式是:如图,白色中的为key,即使索引,当从上到下找到对应的key之后,key下面存放的就是整条对应的数据了,而不是想Myisam那样存放的是数据对应的地址了。

那么问题来了,Innodb多个索引的话,是一种什么样的存在呢,还是如上图右方,增加字段name为索引:它就会建立一个副索引树,同样的结构,白色key索引存放的是name字段对应的值,而蓝色方的data存放的是主索引树的key。

举个例子,当id和name都作为索引的时候,执行select * from table where name = ‘james’ ,

第一步会先在副索引找到key为james的data为1,1是主索引的key。

第二步再到主索引找到key为对1的数据。(select * from table where id= 1)

多提一句,像这种索引的方式叫”聚集索引”,理解为key和data都绑定在一起了。

而Myisam的那种索引的方式叫做”非聚集索引”。

对于B+Tree这种索引,讨论一下uuid和自增id。

Uuid是32位的,毋庸置疑,相对于自增id,uuid的存储空间是较大的。而且uuid为索引时,其要进行较复杂的运算,最终确定索引的key要插入到哪个位置。

而自增id,它符合每次加1的规则,而且规矩已经确定了,它不要做过多的运算,直接从左到右进行横向的扩展(插入),这样性能就有了差别,如图(B+Tree树的高度是固定的,为4层):

Mysql 的Innodb引擎和Myisam数据结构和区别

Mysql 的Innodb引擎和Myisam数据结构和区别

即使是这样,uuid依然在一些项目依然有它市场:

自增id虽然有多个优点,但实际大型项目中却很少采用自增长id的,这是为什么呢?因为uuid几乎保证了不同数据库的不同表的id唯一,可以进行数据切分合并,而自增长id只能保证一个数据库中的一张表的id唯一,进行数据库合并的话并然会因主键冲突而失败,这是一个硬伤。

而且有博主说:分布式架构,意味着需要多个实例中保持一个表的主键的唯一性。这个时候普通的单表自增ID主键就不太合适,因为多个mysql实例上会遇到主键全局唯一性问题

让我们来谈谈组合指数的几个小问题。

[En]

Let’s talk about some minor problems of combinatorial index.

组合指数是有序的,称为最左原理。你什么意思。例如:

[En]

The combinatorial index is ordered, called the leftmost principle. What do you mean. For example:

name、age、weight 这3个字段组成组合索引,name排在第1位,那么查询语句where 后面必须要有name=”value”这个条件,否则此索引是不起作用的,这叫最左原则。

再引用网上的一个例子:

Mysql 的Innodb引擎和Myisam数据结构和区别

索引的好处就是:

  1. 提高检索效率

  2. 降低排序成本,索引对应的字段是会有一个自动排序功能的,默认是升序asc。

Every coin has two sides,它缺点是

  1. 更新索引的IO量。

也就是说,当插入一条数据时,除了插入数据本身之外,还需要插入该数据对应的索引信息的节点,如果对应的表是多个索引,则插入多个数据对应的索引信息节点。并且这些文件作为文件类型存储在硬盘上。

[En]

That is to say, when inserting a piece of data, in addition to inserting the data itself, it is also necessary to insert the node of the index information corresponding to the data, and if the corresponding table is of multiple indexes, the index information node corresponding to multiple data is inserted. And these are stored on the hard disk as file types.

  1. 调整索引所致的计算量,

这个又是怎么理解呢,举个例子,像B-tree索引,在插入索引之前,都要进行计算,该索引要申请多少的空间,插入到哪个位置。

  1. 占用存储空间。

指数可以是好的也可以是坏的。你什么时候需要,什么时候不需要?

[En]

The index can be bad or good. When do you need it and when you don’t?

适合:

  1. 较频繁的作为查询条件的字段应该创建索引

不适合:

  1. 字段值的唯一性太差不适合单独做索引

  2. 更新非常频繁的字段不是

  3. 不会出现在where句中的字段不适合。

Mysql 的Innodb引擎和Myisam数据结构和区别

Original: https://www.cnblogs.com/incognitor/p/16403979.html
Author: 無名之徒
Title: Mysql 的Innodb引擎和Myisam数据结构和区别

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505276/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Flyweight 享元(结构型)

    一:描述:(该模式实际应用较少) Flyweight 享元模式是对大量细粒度的元素进行共享和重用。减少对象的创建减轻内存; 注和单例模式不同的是:享元模式的各个对象佣有各自的行为并…

    数据库 2023年6月11日
    0111
  • 数据库的备份和恢复命令,使用视图,索引,事务

    备份库 直接在cmd窗口中直接输入,结束不需要输入; mysqldump -h端口号 -u用户名 -p密码 数据库名>备份地址 恢复库 在cmd窗口中进行 1、连接数据库 m…

    数据库 2023年6月16日
    0126
  • 第二十章 AOP开发中的坑

    问题 //在同一个业务类中,一个业务方法调用另一个业务方法 //问题: login方法添加有额外功能 // register方法没有添加额外功能 public class User…

    数据库 2023年6月14日
    075
  • java中如何将函数作为参数传递呢?

    函数简介: 函数(function)的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射…

    数据库 2023年6月11日
    092
  • MySQL数据库 DDL 阻塞问题定位 【转载】

    陈臣,甲骨文MySQL首席解决方案工程师,公众号《MySQL实战》作者,有大规模的MySQL,Redis,MongoDB,ES的管理和维护经验,擅长MySQL数据库的性能优化及日常…

    数据库 2023年6月16日
    087
  • mybatis缓存

    加上flushCache=”true”后,再次运行结果如下 2.二级缓存 mybatis的二级缓存默认开启,但真正使用需要在mapper文件中添加相应的缓存…

    数据库 2023年6月16日
    091
  • SpringBoot结合ajax实现登录功能

    AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 AJAX = 异步 JavaScript 和 XML。 AJAX 是一种用于创建快速动态网页的技术。 通过…

    数据库 2023年6月6日
    089
  • CentOS7安装配置Tomcat

    1.安装jdk jdk 安装有两种方式,本文只介绍rpm格式的安装包 安装jdk:在安装包所在的目录下执行如下语句 安装完成后,默认安装在/usr/java下。 配置环境变量,执行…

    数据库 2023年6月11日
    074
  • centos安装chrome和解决chrom点击打不开页面的问题

    1、去官网下载chrom的rpm包 2、进入到下载包的目录,执行:yum -y localinstall google-chrome-stable_current_x86_64.r…

    数据库 2023年6月11日
    0100
  • ORA-12012: error on auto execute of job “SYS”.”ORA$AT_OS_OPT_SY_128403″

    刚接手的一个Oracle 12C数据库,配置监控告警日志的作业时,发现告警日志中有大量下面错误,而且这些错误一般是晚上22点出现 数据库版本信息如下所示: 查了一下官方文档,结合当…

    数据库 2023年6月11日
    059
  • 数据结构入门之用链表模拟栈

    1:栈的介绍: LIFO(last in first out)表示就是后进入的元素, 第一个弹出栈空间.往往先把拿出去使用. 其限制是仅允许在表的一端进行插入和删除运算。这一端被称…

    数据库 2023年6月6日
    080
  • 数据库设计的十个最佳实践

    数据库是应用及计算机的核心元素,负责存储运行软件应用所需的一切重要数据。为了保障应用正常运行,总有一个甚至多个数据库在默默运作。我们可以把数据库视为信息仓库,以结构化的方式存储了大…

    数据库 2023年5月24日
    0109
  • 一,Flink快速上手

    1.依赖配置 1.1 pom文件 8 8 1.13.0 1.8 2.12 1.7.30 org.apache.flink flink-java ${flink.version} o…

    数据库 2023年6月6日
    097
  • 【干货总结】:可能是史上最全的MySQL和PGSQL对比材料

    版权情况:PostgreSQL 11(免费开源)、MySQL5.7 Oracle官方社区版(免费开源)1. CPU限制 PGSQL 没有CPU核心数限制,有多少CPU核就用多少 M…

    数据库 2023年6月9日
    070
  • 关于在linux上部署.netcore项目,只能Linux访问,不能外部主机访问的问题

    在我们在Linux上部署完.netcore项目之后,是进入到部署项目的文件夹之下启动项目,比如我的就是在www/core文件夹下。 首先cd 之后我们直接启动项目 之后我们在win…

    数据库 2023年6月11日
    0176
  • QQ登录简介

    QQ登录简介 (1) QQ登录 QQ登录,亦即我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目。 若想实现QQ登录,需要成为QQ互联的…

    数据库 2023年6月14日
    073
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球