mysql数据库存储引擎和索引的描述_Mysql InnoDB引擎的索引与存储结构详解

前言

在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。

而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

MySQL主要存储引擎的区别

MySQL默认的存储引擎是MyISAM,其他常用的就是InnoDB,另外还有MERGE、MEMORY(HEAP)等。

主要的几个存储引擎

MyISAM管理非事务表,提供高速存储和检索,以及全文搜索能力。

MyISAM是Mysql的默认存储引擎。当create创建新表时,未指定新表的存储引擎时,默认使用MyISAM。每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是.frm(存储表定义)、.MYD (MYData,存储数据)、.MYI (MYIndex,存储索引)。数据文件和索引文件可以放置在不同的目录,平均分布io,获得更快的速度。

InnoDB存储引擎用于事务处理应用程序,具有众多特性,包括ACID事务支持,提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

Memory将所有数据保存在内存中,可以应用于临时表中在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。Memory使用哈希索引,所以数据的存取速度非常快。

Merge允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。

不同存储引擎的横向对比

特点

MyISAM

BDB

Memory

InnoDB

存储限制

没有

没有

64TB

事务安全

支持

支持

锁机制

表锁

页锁

表锁

行锁

B树索引

支持

支持

支持

支持

哈希索引

支持

支持

全文索引

支持

集群索引

支持

数据缓存

支持

支持

索引缓存

支持

支持

支持

数据可压缩

支持

空间使用

N/A

内存使用

中等

批量插入的速度

支持外键

支持

查看和配置存储引擎的操作

1.用show engines; 命令可以显示当前数据库支持的存储引擎情况;

2.要查看表的定义结构等信息可以使用以下几种命令:

Desc[ribe] tablename; //查看数据表的结构

Show create table tablename; //显示表的创建语句,可以查看创建表时指定的ENGINE

show table status like ‘tablename'\G显示表的当前状态值

3.设置或修改表的存储引擎

创建数据库表时设置存储存储引擎的基本语法是:

Create table tableName(

columnName(列名1) type(数据类型) attri(属性设置),

columnName(列名2) type(数据类型) attri(属性设置),

……..) engine = engineName

修改存储引擎,可以用命令

Alter table tableName engine =engineName

对于整个服务器或方案,你并不一定要使用相同的存储引擎,可以为方案中的每个表使用不同的存储引擎。

InnoDB的存储结构

InnoDB使用页面存储结构,下面是InnoDB的表空间结构图:

2019125100837871.jpg?20190251093

Page页面存储格式如下图所示:

2019125100913156.jpg?201902510920

一个页面的存储由以下几部分组成:

页头(Page Header):记录页面的控制信息,共占150字节,包括页的左右兄弟页面指针、页面空间使用情况等,页头的详细说明会在下一篇中描述。

最小虚记录、最大虚记录:两个固定位置存储的虚记录,本身并不存储数据。最小虚记录比任何记录都小,而最大虚记录比任何记录都大。

记录堆(record heap):指上图的橙黄色部分。表示页面已分配的记录空间,也是索引数据的真正存储区域。记录堆分为两种,即有效记录和已删除记录。有效记录就是索引正常使用的记录,而已删除记录表示索引已经删除,不在使用的记录,如上图的深蓝色部分。随着记录的更新和删除越来越频繁,记录堆中已删除记录将会越多,即会出现越来越多的空洞(碎片)。这些已删除记录连接起来,就会成为页面的自由空间链表。

未分配空间:指页面未使用的存储空间,随着页面不断使用,未分配空间将会越来越小。当新插入一条记录时,首先尝试从自由空间链表中获得合适的存储位置(空间足够),如果没有满足的,就会在未分配空间中申请。

slot区:slot是一些页面有效记录的指针,每个slot占两个字节,存储了记录相对页面首地址的偏移。如果页面有n条有效记录,那么slot的数量就在n/8+2~n/4+2之间。下一节详细介绍slot区,它是记录页面有序和二分查找的关键。

页尾(Page Tailer):页面最后部分,占8个字节,主要存储页面的校验信息。

页面中的页头,最大/最小虚记录以及页尾都是页面中有固定的存储位置。

InnoDB的索引结构

InnoDB使用B+Tree的方式存储索引。

Innodb的一个表可能包含多个索引,每个索引都使用B+树来存储。而索引包括聚集索引和二级索引,聚集索引使用表的主键作为索引键,包含表的所有字段。二级索引只包含索引键和聚集索引键(主键)的内容,不包括其他字段。每一个索引都是一棵B+树,每棵B+树由很多页面组成,而每个页面大小一般为16K。从B+树的组织结构来看,B树的页面可分为:

叶子节点:B树层次为0的页面,存储记录的所有内容。

非叶子节点:B树层次大于0的页面,只存储索引键和页面指针。

一棵典型的B+树结构:

2019125101011640.jpg?2019025101018

从上图可知,相同层次的页面是用一个双向链表连接起来的。

一般情况下,从B+树的最左边叶子节点开始,一直向右扫描,就可以得到B+树的从小到大的所有数据。因此,对于叶子节点,有如下特征:

页内数据是按索引键排序的。

页面的任一记录的索引键值不小于其左兄弟页面的任何记录。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

本文标题: Mysql InnoDB引擎的索引与存储结构详解

本文地址: http://www.cppcns.com/shujuku/mysql/251001.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue结合HTML5拖放API 实现目录拖拽~

拖放事件 dom被拖拽--->经过一些dom--->到达指定dom 被拖拽的dom:(源对象) dragstart 源对象被拖拽 drag 源对象拖拽过程中 dragend 源对象拖拽结束(drop事件后执行) 拖拽过程中经过的dom:&#xf…

【转】EMC存储移除热备盘Hot spare的方法

转载请在文首保留原文出处:EMC中文支持论坛 https://community.emc.com/docs/DOC-17382 介绍 本文将介绍如何移除Hot spare磁盘的两种方法。 更多信息 方法一: 登录Unisphere导航至Storage -> Disks从列表中找到目标hot spare盘确认Hot spare replaci…

jQuery(一)初识

jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax异步请求方式 selector: 操作(DOM)/$(selector).action(): <!DOCTYPE html> <html> <head> <meta charset"utf-8&q…

Java方法中的参数太多,第3部分:构建器模式

在我的前两篇文章中&#xff0c;我研究了如何通过自定义类型和参数对象减少构造函数或方法调用所需的参数数量。 在本文中&#xff0c;我将讨论如何使用构建器模式来减少构造器所需的参数数量&#xff0c;并讨论该模式如何甚至可以帮助采用过多参数的非构造器方法。 在《 有效…

c 连接mysql.mwb_CodeSmith连接mysql提示“找不到请求的 .Net Framework Data Provider”的解决方法...

下载了codesmith 8&#xff0c;连接Mysql却提示“找不到请求的 .Net Framework Data Provider"。&#xff11;&#xff0c;下载MySql.Data.dll&#xff1a;https://dev.mysql.com/downloads/windows/visualstudio/ 下载zip格式的即可&#xff0c;解压后将MySql.Data.dll复…

node那点事(二) -- Writable streams(可写流)、自定义流

可写流&#xff08;Writable Stream&#xff09; 可写流是对数据写入目的地的一种抽象。 可写流的原理其实与可读流类似&#xff0c;当数据过来的时候会写入缓存池&#xff0c;当写入的速度很慢或者写入暂停时候&#xff0c;数据流便会进入到队列池缓存起来&#xff0c;当然即…

第16章-使用Spring MVC创建REST API

1 了解REST 1.1 REST的基础知识 REST与RPC几乎没有任何关系。RPC是面向服务的&#xff0c;并关注于行为和动作&#xff1b;而REST是面向资源的&#xff0c;强调描述应用程序的事物和名词。 为了理解REST是什么&#xff0c;我们将它的首字母缩写拆分为不同的构成部分&#xf…

使用Apache Mahout创建在线推荐系统

最近&#xff0c; 我们一直在为Yap.TV实施推荐系统&#xff1a;在安装应用程序并转到“ Just for you”选项卡后&#xff0c;您可以看到它的运行情况。 我们以Apache Mahout为基础进行建议。 Mahout是一个“可扩展的机器学习库”&#xff0c;其中包含使用协作过滤算法的基于用户…

linux mono mysql_LJMM平台( Linux +Jexus+MySQL+mono) 上使用MySQL的简单总结

近准备把PDF.NET框架的开源项目“超市管理系统”移植到Linux上跑(演示地址&#xff1a;http://221.123.142.196)&#xff0c;使用Jexus服务器和MySQL数据库&#xff0c;相对使用SQLite而言&#xff0c;用MySQL问题比较多&#xff0c;但最后还是一一解决了&#xff0c;先总结如下…

node中的缓存机制

缓存是node开发中一个很重要的概念&#xff0c;它应用在很多地方&#xff0c;例如&#xff1a;浏览器有缓存、DNS有缓存、包括服务器也有缓存。 一、缓存作用 那缓存是为了做什么呢&#xff1f; 1.为了提高速度&#xff0c;提高效率。 2.减少数据传输&#xff0c;节省网费。 …

template里面要做数据渲染,但是数据还没有出来

<el-dialog title"企业详情" :visible.sync"showEditPayment" close"closeDialog" v-if"detail"><el-tabs type"border-card"><el-tab-pane label"客户信息"><el-row><el-col class&q…

《H5 移动营销设计指南》 读书笔记整理

一个前端工程师最近迷上了营销类的H5页面&#xff0c;被五花八门的H5页面迷的眼花缭乱&#xff0c;兴趣使然&#xff0c;于是买了一本《H5 营销设计指南》&#xff0c;看完以后对营销类的H5页面有了更深的理解&#xff0c;感觉很实在&#xff0c;所以参考读书笔记整理成PPT分享…

Stacktraces告诉了事实。 但事实并非如此。

我们公司致力于使软件错误的原因对开发人员和运营透明。 与替代解决方案相反&#xff0c; 我们将问题的位置浮出水面&#xff0c;使您指向源代码中的恶意行。 即使我们目前以检测内存泄漏的能力而闻名&#xff0c;但我们也正在扩展到其他领域。 为了给您一些有关我们研究方向的…

mysql-plus多数据库_IDEA项目搭建九——MybatisPlus多数据库实现

一、简介MybatisPlus中引用多数据库时&#xff0c;传统的配置就失效了&#xff0c;需要单独写配置来实现&#xff0c;下面就说一下具体应该如何操作二、引入MybatisPlus多数据源配置还是先看一下我的项目结构&#xff0c;Model是单独的模块&#xff0c;请自行创建1、创建一个Ma…

写一个函数的程序,判断是否是浮点数

算法&#xff1a; 0.先把小数&#xff0c;转换成str类型&#xff0c;才能调以下方法判断&#xff1b; 1.先判断数值中&#xff0c;是否有小数点&#xff0c;用count计数器&#xff1b; 2.是小数的&#xff0c;需要以‘.’分割小数&#xff1b; 3.小数点左侧若是负数&#xff0c…

数字逻辑基础篇1

1. 双阈值准则在模拟条件下&#xff0c;假设点亮灯泡需要1.7V以上电压。抽象为数字电路&#xff0c;可以认为&#xff1a; U>1.7V U1 U<1.7V U0 这种条件称之为单阈值&#xff08;1.7&#xff09;&#xff0c;但是单阈值导致的问题是&#xff1a; 电压在1.7V附近…

Neo4j:在Neo4j浏览器的帮助下探索新数据集

当我查看一个新的Neo4j数据库时&#xff0c;发现困难之一是确定其中包含的数据的结构。 我习惯于关系数据库&#xff0c;在该数据库中您可以轻松地获取表列表和外键&#xff0c;从而使它们彼此连接。 传统上&#xff0c;使用Neo4j时很难做到这一点&#xff0c;但是随着Neo4j浏…

V8 —— 你需要知道的垃圾回收机制

前言V8 blog近日发布了文章描述了“并发标记”的新技术&#xff0c;提升标记过程的效率。并发标记是一个主要用新的平行和并发的垃圾收集器替换旧的垃圾回收器的项目&#xff0c;现在Chrome 64和Node.js v10已经默认启用并发标记。讲解之前我们先回顾一下基本知识点。基本概念 …

词法分析器java_Java代码到底是如何编译成机器指令的。

原文地址&#xff1a;https://mp.weixin.qq.com/s/XH-JajAne0O7_yCYE5wBbg作者&#xff1a;Hollis在《Java代码的编译与反编译》中&#xff0c;有过关于Java语言的编译和反编译的介绍。我们可以通过javac命令将Java程序的源代码编译成Java字节码&#xff0c;即我们常说的class文…

python中的PEP是什么?怎么理解?(转)

PEP是什么&#xff1f; PEP的全称是Python Enhancement Proposals&#xff0c;其中Enhancement是增强改进的意思&#xff0c;Proposals则可译为提案或建议书&#xff0c;所以合起来&#xff0c;比较常见的翻译是Python增强提案或Python改进建议书。 我个人倾向于前一个翻译&…