Innodb如何实现表--下篇

11 篇文章 4 订阅
订阅专栏


Innodb数据页结构

Innodb数据页由以下7个部分组成:

  • File Header(文件头)
  • Page Header(页头)
  • Infimun和Supremum Records
  • User Records(用户记录,行记录)
  • Free Space(空闲空间)
  • Page Directory(页目录)
  • File Trailer(文件结尾信息)

在这里插入图片描述


File Header

File Header是所有类型页通用的头信息,共占用38字节:

在这里插入图片描述
Innodb存储引擎页主要有下面几种类型:
在这里插入图片描述


Page Header

PageHeader是数据页特有的,专门用来记录数据页的状态信息,共占用48字节:

在这里插入图片描述


Infimum和Supremum Record

在InnoDB存储引擎中,每个数据页中有两个虚拟的行记录,用来限定记录的边界。Infimum记录是比该页中任何主键值都要小的值, Supremum指比任何可能大的值还要大的值。这两个值在页创建时被建立,并且在任何情况下不会被删除。

在Compact行格式和Redundant行格式下,两者占用的字节数各不相同。下图显示了Infimum和Supremum 记录。
在这里插入图片描述


User Records和Free Space

User Record就是之前讨论过的部分,即实际存储行记录的内容。再次强调,InnoDB存储引擎表总是B+树索引组织的。

Free Space很明显指的就是空闲空间,同样也是个链表数据结构。在一条记录被删除后,该空间会被加入到空闲链表中。

在这里插入图片描述


Page Directory

Innodb一个数据页中会存放很多条记录,我们之前讲行格式时提到过。记录的头信息中有一个next_record属性指向下一条记录的位置,因此数据页中多条记录通过单链表的形式串连起来:
在这里插入图片描述
链表的特点就是不支持随机遍历,也不支持二分快速查找,如果我们想要快速定位一条记录,那么只能将整个链表进行一遍遍历,因此对于Innodb来说,必须要优化这个问题。

为了支持随机遍历和二分快速查找,Innodb推出了页目录的概念,页目录相当于一个连续的数组,数组中的元素被称为槽,每个槽代表一段范围内的用户记录,并且指向该范围内的最后一条记录。

n_owned属性指示当前槽指示的范围里面包含了多少用户记录,并且Innodb规定伪记录Infimum的n_owned值总是为1,记录Supremum的n_owned的取值范围为[1,8],其他用户记录n_owned的取值范围为[4,8]。当记录被插人或删除时需要对槽进行分裂或平衡的维护操作。

因此,此时在某个数据页内定位一条记录时,首先通过二分查找定位到某个槽,再通过槽定位到那段范围内的记录,由于记录是通过单链表形式串连起来,所以下面就是遍历这个链表定位到目标记录所在位置。

n_owned不能设置过大,否则当通过槽定位到一组记录时,单链表遍历耗时就会增加; 如果n_owned设置过小,那么二分查找次数会增加,并且页目录也会占据更多空间。


File Trailer

为了检测页是否已经完整地写人磁盘 (如可能发生的写人过程中磁盘损坏、机器关机等) ,InnoDB存储引擎的页中设置了File Trailer部分。

File Trailer只有一个 FIL_PAGE_END_LSN 部分,占用8字节。前4字节代表该页的checksum值,最后4字节和File Header中的FIL_PAGE_LSN相同。

在这里插入图片描述

File Header组成图

将这两个值与File Header 中的 FIL_PAGE_SPACE_OR_CHKSUMFIL_PAGE_LSN 值进行比较,看是否一致(checksum的比较需要通过InnoDB的checksum函数来进行比较,不是简单的等值比较),以此来保证页的完整性(not corrupted)。


在默认配置下,InnoDB存储引擎每次从磁盘读取一个页就会检测该页的完整性,看页是否发生Corrupt,这就是通过File Trailer部分进行检测,而该部分的检测会有一定的开销。用户可以通过参数innodb_checksums来开启或关闭对这个页完整性的检查。

MySQL 5.6.6版本开始新增了参数innodb_checksum_algorithm,该参数用来控制检 测 checksum函数的算法,默认值为crc32,可设置的值有:innodb、crc32、none、strict innodb、strict_crc32、strict_none。
在这里插入图片描述

innodb为兼容之前版本InnoDB页的checksum检测方式,crc32为MySQL 5.6.6版 本引进的新的checksum算法,该算法较之前的innodb有着较高的性能。但是若表中所有页的checksum值都以strict算法保存,那么低版本的MySQL数据库将不能读取这些页。none表示不对页启用checksum检查。

strict_*正如其名,表示严格地按照设置的checksum算法进行页的检测。因此若低版本MySQL数据库升级到MySQL 5.6.6或之后的版本,启用strict_crc32将导致不能读取表中的页。启用strict_crc32方式是最快的方式,因为其不再对innodb和crc32算法进行两次检测。故推荐使用该设置。若数据库从低版本升级而来,则需要进行mysql_upgrade操作。
在这里插入图片描述


实例分析

光说不看假把戏,我们这里实操一番,先搞个表,再搞点数据:

CREATE DATABASE `test`;

USE `test`;

drop table if exists t;

create table t (
    a int unsigned not null auto_increment,
		b char(10),
		primary key(a)
)engine=innodb charset=utf8;

DELIMITER $$

CREATE PROCEDURE load_t(count int unsigned)

BEGIN

set @c=0;
WHILE @c<count DO
   INSERT into t 
	 SELECT NULL,REPEAT(char(97+RAND()*26),10);
	 SET @c=@c+1;
END WHILE;
end;
$$

DELIMITER ;

call load_t(100);

select a,b from t limit 10;

我们通过py_innodb_page_info工具来分析t.idb文件:

在这里插入图片描述
可以发现第四个页是数据页,然后通过hexdump来分析t.idb文件,打开整理得到的十六进制文件,数据页从0x0000c000(16KB*3=0xc000)处开始,得到以下内容:
在这里插入图片描述
先分析File Header的前面38个字节:
在这里插入图片描述

  • db d5 06 1c : 数据页的Checksum值
  • 00 00 00 03: 页的偏移量,从0开始
  • ff ff ff ff: 前一个页,因为当前只有一个数据页,所以为0xffffffff
  • ff ff ff ff:后一个页,因为当前只有一个数据页,所以为0xffffffff
  • 00 00 00 00 00 d4 b5 ec: 页的LSN
  • 45 bf: 页类型,0x45bf代表数据页
  • 00 00 00 00 00 00 00 00: 该值仅在系统表空间定义,代表文件至少被更新到了LSN值,对于独立表空间来说,该值为0
  • 00 00 00 4a: 表空间的SPACE ID

接着分析56字节的page header部分:
在这里插入图片描述

  • 页目录槽数: 00 1a --> 26个槽
  • PAGE_HEAD_TOP: 0d c0,代表空闲空间开始位置的偏移量,即0xc000+0xdc0=0xcdc0处开始

在这里插入图片描述

可以观察这个位置,发现这确实是最后一行的结束,接下去的部分都是空闲空间了。

  • PAGE_N_HEAP=0x8066,当行记录格式为Compact时,初始值为0x0802;当行格式为Redundant时,初始值是2。其实这些值表示页初始时就已经有Infinimun和Supremum的伪记录行,0x8066-0x8002=0x64,代表该页中实际的记录有100条记录。
  • PAGE_FREE=0x0000代表可重用的空间首地址,因为这里没有进行过任何删除操作,故这里的值为0。
  • PAGE_GARBAGE=0x0000代表删除的记录字节为0,同样因为我们没有进行过删除,所以这里的值依然为0。
  • PAGE_LAST_INSERT=0X0DA5,表示页最后插入的位置的偏移量,即最后插入位置应该在0xc0000+0x0da5=0xcda5处:
    在这里插入图片描述
    可以看到的确是最后插入a列值为100的行记录,但是这次直接指向了行记录的内容,而不是指向行记录的变长字段长度的列表位置。
  • PAGE_DIRECTION=0x0002,因为通过自增长的方式进行行记录的插入,所以PAGE_DIRECTION的方向是向右,为0x00002。
  • PAGE_N_DIRECTION=0x0063,表示一个方向连续插入记录的数量,因为我们是自增长的方式插入了100条记录,因此该值为99。
  • PAGE_N_RECS=0x0064,表示该页的行记录数为100,注意该值与PAGE_N_HEAP的比较,PAGE_N_HEAP包含两个伪行记录,并且是通过有符号的方式记录的,因此值为0x8066。
  • PAGE_LEVEL=0x00,代表该页为叶子节点。因为数据量目前较少,因此当前B+树索引只有一层。B+数叶子层总是为0x00。
  • PAGE_INDEX_ID=0x000000000000001ba,索引ID。

在这里插入图片描述
上面就是数据页的Page Header部分了,接下去就是存放的行记录了,前面提到过InnoDB存储引擎有两个伪记录,用来限定行记录的边界,接着往下看:

在这里插入图片描述
观察0xc05E到0xc077,这里存放的就是这两个伪行记录,在InnoDB存储引擎中设置伪行只有一个列,且类型是Char(8)。伪行记录的读取方式和一般的行记录并无不同,我们整理后可以得到如下结果:

在这里插入图片描述
然后来分析 infimum行记录的 recorder header部分,最后两个字节位001c表示下一个记录的位置的偏移量,即当前行记录内容的位置0xc063+0x001c,即0xc07f。
在这里插入图片描述

Compact行格式复习

0xc07f应该很熟悉了,之前分析的行记录结构都是从这个位置开始,如:
在这里插入图片描述
可以看到这就是第一条实际行记录内容的位置了,整理后我们可以得到(跳过前面头信息等字节):

00 00 00 01 -->因为每位建表时设置了主键,这里的ROWID即为列a的值1
00 00 00 00 14 8f ---> 事务ID
bd 00 00 01 35 01 10 --> 回滚指针
78 78 78 78 78 78 78 78 78 78 --> b列的值

通过 Recorder Header的最后两个字节记录的下一行记录的偏移量就可以得到该页中所有的行记录,通过Page Header的PAGE_PREV和PAGE_NEXT就可以知道上个页和下个页的位置,这样InnoDB存储引擎就能读到整张表所有的行记录数据。


最后分析 Page Directory。前面已经提到了从0x0000ffc4到0x0000fff7是当前页的

Page Directory,如下:

在这里插入图片描述
需要注意的是,Page Directory是逆序存放的,每个槽占2字节,因此可以看到0063是最初行的相对位置,即0xc063;0070就是最后一行记录的相对位置,即0xc070。我们发现这就是前面分析的Infimum和Supremum的伪行记录。

Page Directory 槽中的数据都是按照主键的顺序存放的,因此查询具体记录就需要通过部分进行。前面已经提到InnoDB存储引擎的槽是稀疏的,故还需通过 Recorder Header的n_owned进行进一步的判断,如InnoDB存储引擎需要找主键a为5的记录,通过二叉查找PageDirectory的槽,可以定位记录的相对位置在00e5处,找到行记录的实际位置0xc0e5。
在这里插入图片描述
可以看到第一行的记录是4,不是我们要找的6,但是可以发现前面的5字节的Record Header为04 00 28 00 22。找到4~8位表示n_owned值得部分,该值为4,表示该记录有4个记录,因此还需要进一步查找,通过 recorder header 最后两个字节的偏移量0x0022找到下一条记录的位置0xc107,这才是最终要找的主键为5的记录。

Compact行格式中记录头信息如下:
这里是引用


Mysql技术内幕之
muweiyun的博客
03-10 135
其中 File Header、Page Header、File Trailer的大小是固定的,分别为38、56、8字节,这些空间用来标记该页的一些信息,如 Checksum,数据页所在B+树索引的层数等。比如前面提到的InnoDB 1.0.x版本提供了新的页数据结构来支持压缩功能,完全的溢出(off page)大变长字符类型字段的存储。,如图4-5所示,在数据页中只存放20个字节的指针,实际的数据都存放在Off Page 中,而之前的Compact和 Redundant两种格式会存放768个前缀字节。
InnoDB数据存储结构
m0_57001006的博客
06-27 1363
页a, 页b, 页c… 页n这些页可以不在物理结构上相连, 只要通过双向链表相关联即可. 每个数据页中的记录会按照主键值从小到达的顺序组成一个单向链表, 每个数据页都会为存储在它里面的记录生成一个页目录, 在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽位, 然后再遍历该槽对应分组中的记录即可快速找到指定的记录页目录等我们下面详细介绍页结构的会讲解注意: 这些页是同一层的页, 可以不在物理结构上相连, 但是页分配的时候确实是相连的, 但是呐不是同一层相连。
mysql之InnodbInfimumSupremum与用户记录的二三事
欢谷悠扬
03-13 2114
一、前言 在上一篇中,学习了页的结构和行记录信息在页中的与伪记录的关系。这一篇中先验证一下伪记录与行记录的关系。下面开始~ 二、构建基础实验环境 1.创建 CREATE TABLE `compact_record_page` ( `col0` int(11) NOT NULL, `col1` varchar(10) DEFAULT NULL, `col2` char(5) DEFAULT NULL, `col3` int(11) DEFAULT NULL, `col4` varch
inf sup上下确界与 min, max 的区别
Anne033的博客
03-30 6722
inf 是 infimum 的简称,supsupremum 的简称。 使用 inf 或 sup 总能保证一个函数的 inf 或 sup 存在,而函数的 min 或 max 有时候不存在。 sup 的定义:一个集合最小的上界 inf 的定义:一个集合最大的下界 sup(X)是取上限函数,inf(X) 是取下限函数。 supsupremum的简写,意思是:上确界,最小上界。 inf是infimum的简写,意思是:下确界,最大下界。 一、上确界: 上确界是一个集的最小上界,是数学分析中最基本的概念。“
Infimum and supremum
qq_66485519的博客
11-28 383
1
几种不常见的MySQL InnoDB 死锁情况--1
03-16
本篇文章将探讨几种不常见的MySQL InnoDB死锁情况。 一、死锁的概念与产生原因 死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们都将无法推进下去。InnoDB引擎通过...
InnoDB实现序列化隔离级别的方法
09-09
**二、InnoDB实现序列化隔离级别的策略** 1. **显式事务内的SELECT语句** 当SELECT语句在一个显式的事务(即非AUTOCOMMIT模式)内执行时,InnoDB会自动为该SELECT语句添加`LOCK IN SHARE MODE`,即施加共享锁...
数据库进阶七篇(一)-- InnoDB存储引擎
10-27 659
数据库进阶七篇第一部分InnoDB存储引擎姗姗来迟! 目录 ​ 1.Mysql基本架构 2.存储引擎比较 3.InnoDB存储引擎 3.1 内存 3.1.1 缓冲池 3.1.2 LRU List 3.1.3 Free List 3.1.4 Flush List和脏页 3.1.5 change Buffer 3.1.6 自适应哈希索引 AHI 3.1.7 重做日志缓冲 3.2 后台线程 3.2.1 Master Thread 3.2.2 IO Thread 3.2....
一篇文章把-InnoDB-的事务机制给你弄的明明白白,帮你深度探寻Spring循环依赖源码实现
m0_64867486的博客
12-10 254
小王:我肯定付款了啊,不然怎么下单。 老板说:我没收到钱啊。你把付款的截图发给我。 小王说:我吃饭还能不付钱吗,你等着。 于是小王给老板截图了,老板拿着截图去找了美团技术,美团技术一查,转账失败。跟老板说不好意思,今天这代码是实习生写的,我们马上开除他,稍后转给你。这时候老板一颗悬着的心才放下,可不能一天就卖一份水饺还没收到钱,这不亏大了呢! 以上纯属虚构,没有诋毁美团实习生的意思。 从上面的问题看,付款成功了,转账失败了,这时候用户吃到了饭,但是老板没收到钱。放在正常的堂食,你不先付款,估计人儿就的赶你出
MySQL 入门到高级:基础篇 下篇-尚硅谷 2021年
最新发布
08-21
本文将基于"MySQL 入门到高级:基础篇 下篇——尚硅谷 2021年"的主题,深入探讨MySQL的基础知识,涵盖从安装配置到实际操作的多个方面。 一、MySQL安装与配置 MySQL的安装过程相对简单,可适用于多种操作系统,包括...
MySQL5.7-InnoDB 的特性
sen_ice的专栏
04-23 1429
大佬们,我们经常去面试,面试官总是问我们MySQL InnoDB有什么特点,以下是本人对MySQL InnoDB的特性见解,互相共勉,有不对的欢迎指出,后续我还会慢慢细化这些特性点专题。 InnoDB特性主要有以下几点: InnoDB恢复机制: 如果服务器因硬件或软件意外宕机了,你可以不管这时候数据库发生了什么情况,而且在重启数据库中也不需要做任何特别的处理。InnoDB崩溃后会通过恢复机制自动恢复完成崩溃之前提交的更改,并回滚正在进行但尚未提交的更改,且允许您重新启动并从中断处继续处理业务。 In..
innodb 计算checksum
帅的数说
03-05 846
buf_flush_page-->buf_flush_write_block_low-->buf_flush_init_for_writing-->buf_calc_page_new_checksum 在刷盘时计算checksum,并写入页中。 淘宝丁奇:页是否损坏校验: http://dinglin.iteye.com/blog/821951
关于INNODB SYSTEM RECORD infimumsupremum的学习和实验研究
cri5768的博客
03-28 287
关于INNODB SYSTEM RECORD infimumsupremum的学习和实验研究 接上一篇 http://blog.itpub.net/7728585/viewspace-2063921/ 关于MYSQ...
[MySQL 学习] MySQL5.6 的checkusm
weixin_34393428的博客
05-10 148
从MySQL5.6.3开始 ,Innodb引入了新的checksum计算方式,checksum算法由新参数innodb_checksum_algorithm来控制,默认为crc32算法,主要有两种算法,一种是老的计算方法(innodb_checksum_algorithm=innodb),使用这种算法是兼容老版本的MySQL。但如果使用crc32算法,...
InnoDB 存储引擎】InnoDB 数据页格式(详细版,数据页格式对于理解索引详细的原理很重要)
yuchangyuan5237的博客
07-12 701
15.6.1 InnoDB 数据页格式(数据页理论,重要).md
【MySQL技术内幕】19-InnoDB数据页结构
通往神秘的道路的专栏
10-16 1575
相信通过前面几个小节的介绍,读者已经知道页是 InnoDB存储引擎管理数据库的最小磁盘单位。页类型为B-Tree Node的页存放的即是中行的实际数据了。在这一节中,我们将从底层具体地介绍 InnoDB数据页的内部存储结构注意 InnoDB公司本身并没有详细介绍其页结构的实现, MySQL的官方手册中也基本没有提及 InnoDB存储引擎页的内部结构。 InnoDB数据页由以下7个部分组成,如图所...
InnoDB逻辑存储结构
爱我所爱0505
08-06 1617
介绍了InnoDB存储引擎逻辑结构的组成部分,页的行格式及页数据页结构
sup, inf 与 min, max 的区别
热门推荐
天天向上的专栏
07-27 20万+
以前优化函数时的决策目标总是: min 或 max。最近读论文时,发现不少高质量的论文中总是写成: inf 或 sup。 inf 是 infimum 的简称,supsupremum 的简称。 使用 inf 或 sup 总能保证一个函数的 inf 或 sup 存在,而函数的 min 或 max 有时候不存在。 例如函数: f(x)=sin(x)/xf(x)=sin⁡(x)/xf(x)=...
InnoDB(三):InnoDB的逻辑和物理存储
蓬莱道人的博客
10-24 2567
1. InnoDB逻辑存储结构 所有的数据都被放在一个空间中,这个空间称为空间(table space),空间又由段(segmet)、区(extent)和页(page)组成,如下图所示。 (1)空间(table space) 空间是存储引擎的最高层,所有的数据都存放在空间中。如果没有开启innodb_file_per_table,则所有数据都存放在默认的共享空间中,如果开启这个参数,那么,每张的数据可以单独放到一个空间中。空间就是存放的地方,它可以是一个物理文件...
深入理解MySQL与InnoDB:从基础到实践
每张InnoDB中都对应一个或多个数据文件,这些文件存储在空间中,空间可以是单个文件或者一组文件。 在InnoDB中,每个的数据被组织成一个个页(Page),页是InnoDB存储的基本单位。除了数据页,还有索引页...
写文章

热门文章

  • 无符号整型和有符号整型的区别,以及无符号整型的使用 35837
  • 二叉树的创建 16553
  • Swagger 3.0快速入门 15125
  • 实型(浮点型---float,double)以及printf输出一些注意事项 13861
  • 迷宫算法(DFS) 13839

分类专栏

  • 经典阅读
  • Linux设计与实现
  • 程序员的自我修养链接装载与库
  • 考研
  • 1000题(数一)
  • 云原生
  • Docker 20篇
  • K8s 13篇
  • CI/CD 6篇
  • 四大件
  • CS 144 & MIT 6.829 16篇
  • MIT 6.S081 37篇
  • 基于RISC-V搭建操作系统系列 12篇
  • c语言 3篇
  • Linux基础学习 3篇
  • 汇编 7篇
  • 计算机组成原理 2篇
  • 操作系统 36篇
  • Linux探究之路 54篇
  • 深入理解Linux操作系统 1篇
  • 程序员的自我修养--装载,链接与库
  • Linux网络篇 7篇
  • 杂类篇 4篇
  • 系统设计 1篇
  • 前端学习 19篇
  • 自动化测试 1篇
  • 爬虫 4篇
  • 技术杂谈 67篇
  • web安全 3篇
  • 踩坑集锦 3篇
  • Java篇
  • HotSpot虚拟机源码专栏 2篇
  • NIO 42篇
  • Java设计模式 25篇
  • 集合类优美的源码品鉴 4篇
  • JAVA知识点整理 34篇
  • JVM学习 26篇
  • JUC 36篇
  • 数据库篇
  • CMU 15-445 21篇
  • MIT 6.830 6篇
  • levelDB 1篇
  • Mysql入门笔记 32篇
  • MySql超神之路 36篇
  • Innodb存储引擎 11篇
  • Redis 33篇
  • 框架篇
  • SSM框架 33篇
  • SpringBoot学习 31篇
  • Java Bean Validation规范 10篇
  • 日志框架 5篇
  • JAVA web前置基础学习知识 42篇
  • Netty框架源码探究 14篇
  • SpringSecurity 16篇
  • tomcat设计思想学习 18篇
  • Spring源码研读 88篇
  • 分布式
  • MIT 6.824 3篇
  • 数据密集型应用 3篇
  • 微服务
  • Seata 源码解析专栏 6篇
  • Nginx 9篇
  • ELK 11篇
  • SpringCloud 42篇
  • apollo 2篇
  • 链路监控篇 2篇
  • dubbo 6篇
  • 消息队列 1篇
  • rabbitmq 7篇
  • kafka 2篇
  • 大数据
  • hadoop 2篇
  • hbase 3篇
  • tools 2篇
  • 数据结构和算法 6篇
  • leetcode刷题 109篇
  • GO 21篇
  • GoLang从零开始系列 10篇
  • Go Web 7篇
  • Go语言设计与实现 6篇
  • Archaius框架源码解析 1篇
  • Ribbon框架源码解析 2篇
  • c++知识点整理 41篇
  • c++知识点 29篇
  • 洛谷刷题 7篇
  • 数据结构之串 4篇
  • 排序算法 15篇
  • 数据结构之图 12篇
  • 数据结构之二叉树 14篇
  • 数据结构之线性表 22篇
  • 项目 17篇
  • c语言相关知识点 25篇
  • 递归函数 4篇
  • c语言链表 7篇
  • stl常用算法 22篇
  • c语言文件操作 17篇
  • c语言字符串相关函数 11篇
  • stl容器篇学习汇总 50篇
  • Qt学习 13篇

最新评论

  • MIT 6.830 数据库系统 -- Lab One

    唐可可我最闪耀: 感谢楼主!

  • 按条件替换-------replace_if

    小骏599: 解决了吗哥

  • 替换算法-----replace

    小骏599: 你好 可以只替换p里面的age吗 这样的话代码应该怎么样呀表情包表情包

  • 大白话RISC-V架构中断与异常处理机制

    weixin_40452160: 或者说内部异常(定时器、软中断)需要发送中断complete消息吗?

  • 大白话RISC-V架构中断与异常处理机制

    weixin_40452160: 写的很好, 请问内部异常(比如软中断)支持嵌套吗?软中断和外部中断之间支持嵌套吗?

最新文章

  • 那些年听烂了的名词之“高可用“
  • 自己动手造一个状态机
  • GraphQL及元数据驱动架构在后端BFF中的实践
2024年4篇
2023年214篇
2022年477篇
2021年675篇

目录

目录

分类专栏

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家南通玻璃钢广场雕塑重庆玻璃钢雕塑摆件施工团队呈贡玻璃钢雕塑造型厂家招做玻璃钢雕塑信息不可替代的玻璃钢花盆江苏户外玻璃钢雕塑玻璃钢博物馆雕塑价格泰安玻璃钢雕塑价格绍兴玻璃钢十二生肖雕塑深圳玻璃钢花盆制造玻璃钢仿真狮子雕塑玻璃钢卡通雕塑销售厂家上海室内商场美陈销售厂家贵州玻璃钢酒店人物雕塑江都玻璃钢仿铜雕塑东阳人物玻璃钢雕塑制作厂连云港小品系列玻璃钢雕塑厂家东莞树脂玻璃钢雕塑制作湖北仿铜玻璃钢雕塑批发重庆个性化玻璃钢雕塑订做价格六安玻璃钢雕塑报价河北周年庆典商场美陈吉安多彩玻璃钢雕塑定制静安区定制玻璃钢雕塑价格合理宣城欧式玻璃钢雕塑定制玻璃钢花盆品牌哪种好昌邑玻璃钢卡通人物雕塑定做内蒙古广场玻璃钢雕塑定做佛山玻璃钢艺术雕塑大型主题商场美陈制造香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化