当前位置: 首页 > news >正文

网站建设改手机号济南莱芜都市网

网站建设改手机号,济南莱芜都市网,网盘wordpress,wordpress 头部不显示MySQL下用的比较多、比较广的存储引擎就属InnoDB。这里我们来介绍下InnoDB存储引擎下数据记录的存储格式——Row Format行格式基本操作在MySQL中#xff0c;所谓Row Format行格式是指数据记录(或者称之为行)在磁盘中的物理存储方式。具体地#xff0c;对于InnoDB存储引擎而言…MySQL下用的比较多、比较广的存储引擎就属InnoDB。这里我们来介绍下InnoDB存储引擎下数据记录的存储格式——Row Format行格式基本操作在MySQL中所谓Row Format行格式是指数据记录(或者称之为行)在磁盘中的物理存储方式。具体地对于InnoDB存储引擎而言常见的行格式类型有Compact、Redundant、Dynamic和Compressed设置、修改行格式信息在创建、修改数据表的时候可以显式地指定row format行格式。SQL语句语法如下-- 创建数据表时,显示指定行格式CREATE TABLE 表名 (列的信息) ROW_FORMAT行格式名称;-- 创建数据表时,修改行格式ALTER TABLE 表名 ROW_FORMAT行格式名称;与此同时如果需要查看某数据表的行格式可通过如下语句实现show table status from 数据库名 like ;演示示例下面通过一个示例来验证上述语句的使用及效果。在test1数据库中创建一张名为task2的数据表并指定行格式的类型为compactuse test1;-- 指定行格式create table task2(idx int auto_increment,primary key (idx)) row_format compact;-- 查看行格式show table status from test1 like task2;从下图可以看出表的行格式类型被设置为compact然后再将该表的行格式类型修改为dynamic-- 修改行格式alter table task2row_format dynamic;-- 查看行格式show table status from test1 like task2;从下图可以看出表的行格式类型已被修改为dynamicCompact 行格式Compact行格式在MySQL 5.0中被引入其目标是为了更高效的存储数据记录。在该格式下一条数据记录的组成部分如下所示。其大体分为两部分——记录的额外信息、记录的数据内容。后者比较好理解其即是我们存储到数据库的各列(字段)数据值。而前者则是MySQL为了更好描述该条记录而添加的额外信息变长字段的长度列表由于MySQL支持变长的数据类型(如VARCHAR等)故对于该类型而言不仅需要存储该字段的实际数据还需要额外存储该数据的长度信息(即占用的字节数)。而这就是变长字段的长度列表的用途。而一个变长字段的数据长度信息可能会使用12个字节来进行表示具体地如果某变长类型的字段 允许存储的最大字节数不超过255个字节显然长度信息只需要一个字节表示即可而当 某变长类型的字段允许存储的最大字节数超过255个字节时这个时候就需要分情况讨论了该字段数据实际使用的字节数不超过127个字节依然只使用一个字节表示该字段数据实际使用的字节数超过127个字节使用两个字节表示对于该变长类型字段其允许存储的最大字节数该如何计算呢这里我们以常见的VARCHAR(M)类型为例进行说明我们知道该类型表示最多能存储M个字符。那一个字符占多少个字节呢这就和我们之前所说的字符集有关了。我们知道字符集的Maxlen列信息表示该字符集中一个字符最多需要几个字节来表示。比如utf8字符集下Maxlen列值为3、ascii字符集下Maxlen列值为1。故对于VARHCAR(M)来说M x Maxlen 即为在某字符集下该变长类型字段允许存储的最大字节数当然有人可能会问MySQL在读记录的时候如果发现某字段的M x Maxlen值超过255个字节了那么它在读取记录的变长字段的长度列表时是将该字节作为单独的字段长度信息还是作为半个的字段长度信息呢即是读一个字节还是读两个字节。其实这个问题很简单因为数值127写成二进制为 0111 1111。所以如果该字节的第一位为0则该字节就是一个单独的字段长度信息反之为1则说明该字段只是半个的字段长度信息。即将字节的第一位作为标志位Note1. 变长字段的长度列表不存储值为非NULL的长度信息对于变长类型的字段而言如果某记录下该字段的值为NULL则变长字段的长度列表不会存储该字节的信息。因为是特殊值会通过下面即将说明的NULL标志位进行存储2. 变长字段的长度列表不是一定存在的一方面表中可能没有变长类型的字段另一方面如果该记录中所有的变长字段值均为NULL根据第一点易知此时变长字段的长度列表同样也没有存在的必要3. 变长字段的长度列表中各字段长度信息是按列的顺序逆序排列的这里我们假设有一张ascii字符集的数据表其各字段依次为vf1,vf2,vf3,f4。其中vf1,vf2,vf3字段均为变长类型的字段。假设有一条记录其在各字段的值依次为aNULLccc99。即变长字段vf1的长度为1变长字段vf3的长度为3。则该记录的变长字段的长度列表内容为0x03(即十进制的3)0x01(即十进制的1)4. char类型字段的长度信息是否需要存储在 变长字段的长度列表 中取决于其所使用的字符集是否为变长字符集MySQL中char(M)类型的字段表示该字段最多可以存储M个字符。对于定长字符集(如ascii字符集)而言compact行格式下存储该字段所占有的空间固定为M x Maxlen个字节。但是对于变长字符集而言情况就大不一样了例如utf8字符集其存储M个字符所需的空间为M~3M个字节。在compact行格式下char类型字段会由于使用变长字符集而导致其所占的字节数(即长度信息)不定故此时char类型的数据同样也需要在变长字段的长度列表中存储其长度信息NULL值标志位对于记录中的特殊值NULL而言如果直接存储到记录的数据内容部分则显得比较浪费空间故这里使用位向量进行存储。如果某字段为主键或被NOT NULL所修饰则其值自然不允许为NULL。故位向量中不是直接包含了所有字段而是排除了值不能为NULL的字段此举进一步减小了占用空间。具体地位向量中某一位为1则表明该列值为NULL否则如果该位值为0则表明值不为NULL值得一提的是首先位向量中代表的列同样是按照列的顺序逆序排列的其次对于位向量不足一个字节的部分高位需补0即按照一字节对齐。假设这里有一张数据表其字段定义分别为f1,f2,f3,f4。其中f2字段为主键其余字段均可以为NULL则有一条记录其值依次为Amy,1,NULL,2则该记录的NULL值标志位内容如下所示NoteNULL值标志位不是一定存在的如果某条记录所有字段均不允许为NULL则显然用于管理记录字段为NULL值的NULL值标志位在该条记录中是没有必要的即不存在记录头信息记录头信息用于描述该条记录其固定为5个字节即40位。其定义如下预留位1、2暂未使用delete_mask当前记录被删除的标志位min_rec_maskB树的每层非叶子节点中的最小记录的标志位n_owned当前记录拥有的记录数heap_no当前记录在记录堆中的位置record_type当前记录类型。具体地0: 普通记录1: B树非叶子节点记录(即所谓的目录项记录)2: 最小记录3: 最大记录next_record下一条记录的相对位置记录的数据内容记录的数据内容通常来说就是我们日常开发、使用过程中需存储的记录的数据内容。但其实MySQL对于我们所定义的数据表还会默认的插入一些其他列(字段)即所谓的隐藏列。其字段定义说明如下DB_ROW_ID该字段占6个字节用于标识一条记录DB_TRX_ID该字段占6个字节其值为事务IDDB_ROLL_PTR该字段占7个字节其值为回滚指针上述3个字段除了DB_ROW_ID字段其余两个字段均一定会被添加到数据表中的。一般地当用户未指定数据表的主键时MySQL会选择非NULL的Unique键作为主键。而如果非NULL的Unique键也没有的话这个时候MySQL才会添加向数据表添加DB_ROW_ID字段用来作为主键。当然上述隐藏列的3个字段的值是由MySQL自动生成、存储的Note1. 值为NULL的记录不会存储于此记录的数据内容不包括字段值为NULL的数据内容。前文已经提到对于记录中某字段为NULL值的信息已经体现在NULL值标志位中了故此处将不再重复存储以节省空间2. char类型字段的存储方式值得一提的是对于变长字符集下的char(M)类型字段而言出于存储优化的角度考虑compact行格式要求存储该字段的值时至少占用M个字节字段值所占字节数不足时则使用 空格字符(空格字符在ascii字符集下为0x20) 填充。比如某字段类型为char(10)其使用utf8字符集即使某条记录该字段值为abc只使用了3个字节。但是在存储abc时依然会通过在其后填充若干个空格字符的方式使其达到占用10个字节的空间来进行存储。此举目的其实也很简单当该条记录下次需要更新时如果新值使用的空间不超过10个字节时则可以直接在此条记录处进行更新而无需重新分配一个新的记录空间从而导致原有的记录空间成为碎片。当然在读值的时候会把填充的空格字符移除掉Redundant 行格式Redundant作为MySQL 5.0之前使用的一种行格式其示意图如下所示可以看到其与compact行格式在结构上大体还是比较相似的。这里主要来介绍下其与compact行格式不同之处字段长度偏移列表在Redundant行格式下其通过字段长度偏移列表存储记录中所有列(包括隐藏列)的长度信息。首先计算记录中各字段的长度信息然后再顺序计算长度的累计值最后再按数据表各字段的顺序逆序排列即为实际存储的字段长度偏移列表。反过来如果期望获取记录中某字段的长度信息只需计算两个相邻长度累计值的差值即可具体地字段长度偏移列表中的各偏移量所占空间要么均为1个字节要么均为2个字节。那么实际存储记录时到底是使用1个字节还是使用2个字节来存储字段长度偏移列表呢其实在该格式下策略比较简单。若记录的整个数据内容部分(包括隐藏列)所占用的空间不超过127(0x7F)个字节则该记录的字段长度偏移列表的各偏移量自然只需使用1个字节即可表示毕竟所有列长度值加起来也不超过127那么各个列所对应的偏移量自然也不会超过127了反之如果超过127个字节但不超过32767(0x7FFF)个字节则会使用2个字节来表示各偏移量。与此同时该记录会通过记录头信息的1byte_offs_flag属性来表明该记录各偏移量的字节数以便读取记录的时候方便解析Note偏移量包含NULL值标志一方面通过对比compact与redundant的结构图可以发现在compact行格式下其没有NULL值列表另一方面偏移量在使用1、2个字节表示时其能表示的最大值分别为0x7F、0x7FFF即偏移量的第一位实际上是没有使用的。其实原因就在于对于各列偏移量的第一位而言其用于标识该记录下相应列是否为NULL值。如果是NULL值则该位为1反之则为0记录头信息记录头信息用于描述该条记录其固定为6个字节即48位。其定义如下预留位1、2暂未使用delete_mask当前记录被删除的标志位min_rec_maskB树的每层非叶子节点中的最小记录的标志位n_owned当前记录拥有的记录数heap_no当前记录在记录堆中的位置n_field表示记录中列的数量1byte_offs_flag标识字段长度偏移列表中各列的偏移量使用的字节数。0意为每个偏移量均使用2个字节表示1意为每个偏移量均使用1个字节表示next_record下一条记录的相对位置记录的数据内容在redundant行格式下其与compact行格式一样同样有隐藏列的情况。这里就不再赘述了。这里我们就不同的地方进行一些介绍。前面我们提到在compact行格式下对于char(M)类型的字段数据在定长字符集、变长字符集下的存储方式是有差异的相对而言还是比较复杂而在redundant行格式下无论是使用变长字符集还是使用定长字符集char(M)类型的字段总是占用M x Maxlen个字节的空间字段值所占空间的字节数不足则同样会使用 空格字符(空格字符在ascii字符集下为0x20) 进行填充上文提到compact行格式下字段为NULL值是不会在记录的数据内容中占用存储空间冗余存储的而在redundant行格式下对于字段为NULL值在记录的数据内容部分的存储则略有不同如果值为NULL的字段类型为变长数据类型其同样不会在记录的数据内容中占用任何空间来进行存储的如果值为NULL的字段类型为定长数据类型其使用0x00来填充该字段所需占用的空间。例如char(10)类型的字段在ascii、utf8字符集中其Maxlen值分别为1、3。即该字段在数据内容部分会分别占用的10、30个字节。故当该字段为NULL值时会使用0x00来填充这10、30个字节的位置行溢出众所周知InnoDB存储引擎中内存与硬盘交互的基本单位是页一般地页大小为16KB。MySQL规定一个页中至少需要存放两条记录。而所谓的行溢出是指当某个记录的某个字段(varchar、text、blob等类型)的值长度过长、数据量过大会导致一个页中放不下一条记录为此在compact、redundant行格式中如果该记录某字段中数据量过多时则在该记录的数据内容的相应字段处只存储该字段值前768个字节的数据和一个指向存储剩余数据的其他页(即所谓的溢出页)的地址该地址通常占用20个字节Dynamic、Compressed行格式对于Dynamic、Compressed行格式而言其和compact行格式比较相似。不同的在于对待处理行溢出的处理及策略Dynamic、Compressed行格式会把记录中数据量过大的字段值全部存储到溢出页中而不会在该记录的数据内容的相应字段处存储该字段值前768个字节的数据了。而compressed相比较dynamic行格式来说前者会使用压缩算法对所有页面(自然也包括溢出页)进行压缩以减少存储占用
http://www.zqtcl.cn/news/889406/

相关文章:

  • 济南品牌网站建设公司网站单个页面紧张搜索引擎蜘蛛
  • 公司需要一个简单的网站包头网站建设奥北
  • 怎么制作网站导航页新手做网站详细步骤
  • 自己个人网站后台怎么做wordpress多程序用户同步
  • 赣州网联科技有限公司wordpress安装后优化
  • 二手书的网站建设做设计在哪个网站找图片大全
  • 网站seo设计北京市建设投标网站
  • 承德做网站设计的网络推广主要内容
  • 婚纱网站源代码重庆网站定制公司
  • 同一个ip网站太多 seo应用商店网站源码
  • 网站内容框架首页>新闻>正文 网站怎么做
  • 网站制作 搜索做效果图网站有哪些
  • 网站建设的相关技术网站的购物车怎么做
  • 免费建设公司网站腾讯云域名购买
  • 淘宝客网站应该怎么做网页浏览器推荐
  • 怎样做影视网站不侵权商丘专业做网站
  • 哪个网站做刷手最好鹤壁 网站建设
  • 设计接单子网站安徽网站开发推荐
  • 网站建设制作 优帮云怎样注册商标申请
  • 网站怎么做交易市场苏州吴江做网站公司
  • wordpress的字体禁用优化设计的答案
  • 网站建设开发五行属性如何做二级域名网站
  • 珠海做网站的公司介绍最近的新闻大事
  • 手机网站开发解决方案石碣镇网站建设
  • 保定网站建设公司哪家好app开发公司好吗
  • 网站域名备案证书网页素材大宝库
  • 沈阳网站制作的公司哪家好wordpress您访问的网页出错
  • 南京做公司网站有什么网站用名字做图片大全
  • 网站正在建设中页面wordpress 折叠文章
  • 广西建设科技协会网站手工做环保衣的网站