返回顶部
首页 > 资讯 > 数据库 >MYSQL_多版本并发控制、存储引擎、索引的示例
  • 959
分享到

MYSQL_多版本并发控制、存储引擎、索引的示例

2024-04-02 19:04:59 959人浏览 八月长安
摘要

这篇文章主要介绍了Mysql_多版本并发控制、存储引擎、索引的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。多版本并发控制mysql的大

这篇文章主要介绍了Mysql_多版本并发控制、存储引擎、索引的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

多版本并发控制

mysql的大多数事务型存储引擎实现的都不是简单的行级。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制。

可以认为mvcC是行级锁的一种变种,但是它很多情况下避免了加锁操作,因为开销更低。

InnoDB的MVCC,是通过在每行记录最后保存的两个隐藏的列来实现,这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间),当然存储的并不是实际的时间值,而是系统版本好。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来查询到的每行版本号进行比较。

REPEATABLE READ隔离级别下,MVCC的实现:

  • SELECT

    • InnoDB之查找版本早于当前事务版本号的数据行,这样可以确保事务读取的行,要么是在事务开始前已经存在,要么是事务自身插入或者修改过的。

    • 行的删除版本要么未定义,要么大于当前事务版本号,这可以确保事务读取到的行在事务开始之前未被删除。

  • INSERT

    • InnoDB为新插入的每一行保存当前系统版本号作为行版本号。

  • DELETE

    • InnoDB为删除的每一行保存当前系统版本号作为行删除标识。

  • UPDATE

    • InnoDB为插入一航新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除版本号。

MVCC只在REPEATABLE READ跟READ COMMITED两个隔离级别工作。其他两个隔离级别都和MVCC不兼容。因为READ UNCOMMITED总是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对所有读取的数据的行都加锁。

存储引擎

InnoDB存储引擎

InnoDB是MYsql的默认事务型引擎,也是最重要、使用最广泛的存储引擎。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。

InnoDB采用MVCC来支持高并发,并且实现了四个标准的隔离级别。默认级别是REPEATABLE READ(可重复读),并且通过间隙锁+MVCC策略防止幻读的实现,间隙锁使得InnoDB不仅仅锁定查询设计的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。

间隙锁:当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。
参考:间隙锁(Next-Key锁)

主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升。

InnoDB内部做了很多优化,包括从磁盘读取数据时采用的可预测性预读,能够自动在内存中创建hash索引以加速度操作的自适应哈希索引,以及能够加速插入操作的插入缓冲区等。

MyISAM存储引擎

在mysql5.1以及之前的版本,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数等,但是不支持事务和行级锁,而且有一个毫无疑问的缺陷是崩溃之后无法安全恢复。

对于只读的数据、或者表比较小、可以忍受修复操作,则依然可以使用MyISAM引擎。

创建MyISAM表的时候,如果指定了DELAY_KEY_WRITE选项,在每次修改执行完成时,不会立刻将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入到磁盘。这种方式可以极大地提升写入性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。

比较

  • 事务:InnoDB支持事务,MyISAM不支持事务。

  • 锁粒度:InnoDB支持表级锁跟行级锁,而MyISAM只支持表级锁。

  • 外键:InnoDB支持外键。

  • 备份:InnoDB支持热备份,但需要工具

  • 崩溃恢复:MyISAM崩溃后发生损坏的概率比InnoDB高很多,而且恢复的速度也比较慢。

  • 其他特性:MyISAM支持全文索引、压缩、空间函数等特性。

备份的类型

  • 冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行;

  • 温备(warm backup): 服务在线,但仅支持读请求,不允许写请求;

  • 热备(hot backup):备份的同时,业务不受影响。

索引

索引(也叫做“键(key)”)是存储引擎用于快速查找记录中的一种数据结构

B-Tree索引

大多数mysql引擎都支持这种索引。

虽然使用术语“B-Tree",但是不同的存储引擎可能使用不同的存储结构,NDB集群存储引擎内部实际用的是T-Tree,InnoDB则使用B+Tree。

B-Tree索引能够加快访问数据的速度,因为存储引擎不需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始搜索,因此查找速度会快很多。

B-Tree对索引列是顺序组织存储的,很适合查找范围数据。因为索引树是有序的,所以除了用户查找,还可以用来排序和分组。

可以指定多个列作为索引列,多个索引列共同组成索引键。B-Tree索引适用于全键值、键值范围或键前缀查找,其中键前缀查找只适用与根据最左前缀查找。查找一定得按照索引的最左列开始。

B-Tree索引的数据结构

B-Tree

为了描述B-Tree,首先定义一条数据记录为二元组[key,data],key作为记录的键值,对于不同数据记录,key是互不相同的,data为数据记录除key外的数据。

  • 所有节点具有相同的深度,也就是说B-Tree是平衡的。

  • 一个节点中的key从左到右非递减排列。

  • 如果某个指针的左右相邻 key 分别是 keyi 和 keyi+1,且不为 null,则该指针指向节点的所有 key 大于等于 keyi 且小于等于 keyi+1。

查找算法:首先在根节点进行二分查找,如果找到则返回对应节点的data,否则在相应区间的指针指向的节点递归进行查找。

由于插入删除新的数据记录会破坏B-Tree的性质,因此在插入删除时,需要对树进行一个分裂、合并、旋转等操作以保持 B-Tree 性质。

MYSQL_多版本并发控制、存储引擎、索引的示例

B+Tree

与B-Tree相比,B+Tree有以下特点:

  • 每个节点的指针上限为2d而不是2d+1(d为B-Tree的度)。

  • 内节点不存储data,只存储key;外节点不存储指针。

MYSQL_多版本并发控制、存储引擎、索引的示例

带有顺序访问指针的B+Tree

一般在数据库系统或文件系统中使用的B+Tree结构都在经典B+Tree的基础上进行了优化,增加了顺序访问指针。

MYSQL_多版本并发控制、存储引擎、索引的示例

这个优化的目的是为了提供区间访问的性能,例如图中如果要查询key为18到49的所有记录。

优势

红黑树等平衡树也可以用来实现索引,但是文件系统及数据库系统普遍采用B-Tree作为索引结构,主要有以下两个原因:

  • 更好的检索次数:平衡树检索数据的时间复杂度等于树高h,而树高大致为O(h) = O(logN),其中d为每个节点的出度。红黑树的出度为2,而B-Tree的出度一般都很大,红黑树的树高h明显比B-Tree打非常多,因此检索次数也就更多。B+Tree相比较B-Tree更合适外存索引,因为B+Tree内节点去掉了data域,因此可以拥有更大的出度,检索效率会更高。

  • 利用计算机预读特性:为了减少磁盘 I/O,磁盘往往不是严格按需读取,而是每次都会预读。这样做的理论依据是计算机科学中著名的局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用。预读过程中,磁盘进行顺序读取,顺序读取不需要进行磁盘寻道,并且只需要很短的旋转时间,因此速度会非常快。操作系统一般将内存和磁盘分割成固态大小的块,每一块称为一页,内存与磁盘以页为单位交换数据。数据库系统将索引的一个节点的大小设置为页的大小,使得一次 I/O 就能完全载入一个节点,并且可以利用预读特性,相邻的节点也能够被预先载入。

参考:MySQL索引背后的数据结构及算法原理

哈希索引

InnoDB引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用得非常频繁,会在B+Tree索引之上再创建一个哈希索引,这样就让B+Tree索引具有哈希索引的一些优点,比如快速的哈希查找。

哈希索引能在O(1)时间进行查找,但是失去了有序性,它具有以下限制:

  • 哈希索引只包含哈希值跟行指针,而不存储字段值,所以不能使用索引中的值来I避免都去行。

  • 无法用于排序与分组。

  • 只支持精确查找,无法用于部分查找与范围查找。

  • 当出现哈希冲突时,存储引擎必须遍历链表中的所有行指针。

空间数据索引(R-Tree)

MyISAM表支持空间索引,可以用作地理数据存储。空间索引会从所有维度来索引数据,查询时可以根据任意维度来组合查询。

必须使用Mysql的GIS相关函数如MBRONTaiNS()等来维护数据。

全文索引

全文索引是一种特殊类型的索引,它查找的是文本中的关键字,而不是直接比较索引中的值。查找条件使用 MATCH AGAINST,而不是普通的 WHERE。

全文索引一般使用倒排序索引实现,它记录着关键词到期所在文档的映射。

MyISAM存储引擎支持全文索引,InnoDB存储引擎在Mysql 5.6.4版本中也开始支持全文索引。

索引的优点

  • 大大减少了服务器需要扫描的数据行数。

  • 帮助服务器避免进行排序和创建临时表(B+Tree索引是有序的,可以用来Order by和group by操作)。

  • 将随机I/O变为顺序I/O(B+Tree索引是有序的,也就将相邻的数据都存储到一起)。

感谢你能够认真阅读完这篇文章,希望小编分享的“MYSQL_多版本并发控制、存储引擎、索引的示例”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网数据库频道,更多相关知识等着你来学习!

您可能感兴趣的文档:

--结束END--

本文标题: MYSQL_多版本并发控制、存储引擎、索引的示例

本文链接: https://lsjlt.com/news/54860.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MYSQL_多版本并发控制、存储引擎、索引的示例
    这篇文章主要介绍了MYSQL_多版本并发控制、存储引擎、索引的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。多版本并发控制mysql的大...
    99+
    2024-04-02
  • MySQL中Innodb存储引擎索引的示例分析
    这篇文章主要为大家展示了“MySQL中Innodb存储引擎索引的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中Innodb存储引擎索引的示例...
    99+
    2024-04-02
  • Mysql Innodb存储引擎之索引与算法的示例分析
    这篇文章将为大家详细讲解有关Mysql Innodb存储引擎之索引与算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、概述索引太少,查询效率低;索引太多程序性能受到影响,索引的使用...
    99+
    2023-06-29
  • mysql InnoDB存储引擎的示例分析
    这篇文章主要介绍了mysql InnoDB存储引擎的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、概念InnoDB是MySQL默认的存储引擎,如果需要其不支持的特...
    99+
    2023-06-14
  • mysql中索引,触发器,事务,存储引擎的理解
    1、索引:作用于表中的某列,并将其进行排序,有助于快速地进行查询。   索引是对数据库表中一个或多个列的值进行排序的数据结构,是用于提高在数据库表中访问数据的速度的数据库对象。...
    99+
    2024-04-02
  • MySQL中InnoDB存储引擎的示例分析
    这篇文章主要介绍MySQL中InnoDB存储引擎的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、存储引擎SQL 的执行计划是执行器组件调用存储引擎的接口来完成的。那我们可...
    99+
    2024-04-02
  • MySQL中大对象多版本并发控制的示例分析
    小编给大家分享一下MySQL中大对象多版本并发控制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MySQL 8.0:I...
    99+
    2024-04-02
  • MySQL中InnoDB存储引擎架构的示例分析
    这篇文章主要介绍MySQL中InnoDB存储引擎架构的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!InnoDB组件结构:buffer pool : 缓冲池,缓存磁盘的数据r...
    99+
    2024-04-02
  • Mysql实现简易版搜索引擎的示例代码
    目录前言简介ngram 全文解析器创建全文索引检索方式1、自然语言检索(NATURAL LANGUAGE MODE)2、布尔检索(BOOLEAN MODE)与 Like 对比总结前言...
    99+
    2024-04-02
  • mysql多版本并发控制MVCC的实现
    事务隔离级别设置 set global transaction isolation level read committed; //全局的 set session transaction isolat...
    99+
    2024-04-02
  • mysql的MVCC多版本并发控制的实现
    1 什么是MVCC MVCC全称是: Multiversion concurrency control,多版本并发控制,提供并发访问数据库时,对事务内读取的到的内存做处理,用来避免写操作堵塞读操作的并发问题。 举个...
    99+
    2022-05-31
    mysql MVCC多版本并发控制 mysql 多版本并发控制
  • MySQL的多版本并发控制MVCC的实现
    目录什么是MVCC MVCC的实现 MVCC 有没有解决幻读? 什么是MVCC MVCC就是多版本并发控制。 MySQL的事务型存储引擎通过多版本并发控制(MVCC)来提升并发性...
    99+
    2024-04-02
  • MySQL中存储引擎InnoDB配置与使用的示例分析
    这篇文章将为大家详细讲解有关MySQL中存储引擎InnoDB配置与使用的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。innodb 通过多版本并发控制(MVCC)...
    99+
    2024-04-02
  • MySQLMVVC多版本并发控制的实现详解
    目录一、概述二、快照读与当前读1.当前读2.快照读三、隔离级别与版本链复习四、Read View1.实现原理2.Read View规则3.整体流程五、举例1.READ2.REPEAT...
    99+
    2024-04-02
  • PHP中使用Laravel框架的索引版本控制技巧
    Laravel是一个流行的PHP框架,它提供了许多强大的功能,其中之一就是索引版本控制。索引版本控制允许我们轻松地管理数据库中的数据版本,以便于数据的备份和恢复。本文将介绍如何在Laravel中使用索引版本控制。 安装Laravel框架...
    99+
    2023-08-08
    索引 laravel git
  • 基于MySQL中存储引擎与日志说明的示例分析
    这篇文章主要介绍基于MySQL中存储引擎与日志说明的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.1 存储引擎的介绍1.1.1 文件系统存储文件系统:操作系统组织和存取数...
    99+
    2024-04-02
  • MySql优化之体系结构及存储引擎的示例分析
    这篇文章给大家分享的是有关MySql优化之体系结构及存储引擎的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、MySQL结构体系总体上, 我们可以把 MySQL 分成三...
    99+
    2024-04-02
  • MYSQL的多版本并发控制MVCC(Multi-Version Concurrency Control)
    1、概述 MVCC是一种用于数据库管理系统的并发控制技术,允许多个事务同时访问数据库,而不会导致读写冲突。也就是说在读写的时候,线程不用去争抢读写锁。因为加锁的过程比较耗性能。 当然很多时候还是必须的,不能避免,比如说,去ATM机取钱的时候...
    99+
    2023-09-25
    mysql MVCC MYSQL多版本并发控制
  • Node.js V8 引擎与并发:揭示多线程 JavaScript 编程的奥秘
    Node.js 采用 V8 JavaScript 引擎,该引擎通过提供并发执行来实现 JavaScript 的高性能。在 V8 架构中,事件循环和线程池相互协作,以同时处理多个请求,从而最大限度地提高资源利用率。 事件循环 事件循环是一个...
    99+
    2024-04-02
  • 怎么在mysql中实现MVCC多版本的并发控制
    今天就跟大家聊聊有关怎么在mysql中实现MVCC多版本的并发控制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1 什么是MVCCMVCC全称是: Multiversion conc...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作