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

天津建站费用手机网络营销策划方案

天津建站费用,手机网络营销策划方案,惠州做棋牌网站建设哪家公司收费合理,网站公司谁家好第06章 索引的数据结构 1. 索引及其优缺点 1.1 索引概述 MySQL官方对索引的定义为#xff1a;索引#xff08;Index#xff09;是帮助MySQL高效获取数据的数据结构。 **索引的本质#xff1a;**索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”#xff…第06章 索引的数据结构 1. 索引及其优缺点 1.1 索引概述 MySQL官方对索引的定义为索引Index是帮助MySQL高效获取数据的数据结构。 **索引的本质**索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”满足特定查找算法。这些数据结构以某种方式指向数据 这样就可以在这些数据结构的基础上实现高级查找算法。 1.2 优点 1类似大学图书馆建书目索引提高数据检索的效率降低数据库的IO成本这也是创建索引最主要的原因。 2通过创建唯一索引可以保证数据库表中每一行数据的唯一性。 3在实现数据的参考完整性方面可以加速表和表之间的连接。换句话说对于有依赖关系的子表和父表联合查询时可以提高查询速度。 4在使用分组和排序子句进行数据查询时可以显著减少查询中分组和排序的时间降低了CPU的消耗。 1.3 缺点 1创建索引和维护索引要耗费时间并且随着数据量的增加所耗费的时间也会增加。 2索引需要占磁盘空间除了数据表占数据空间之外每一个索引还要占一定的物理空间存储在磁盘上如果有大量的索引索引文件就可能比数据文件更快达到最大文件尺寸。 3虽然索引大大提高了查询速度同时却会降低更新表的速度。当对表中的数据进行增加、删除和修改的时候索引也要动态地维护这样就降低了数据的维护速度。 2. InnoDB中索引的推演 2.1 索引之前的查找 SELECT [列名列表] FROM 表名 WHERE 列名 xxx; 1 1.在一个页中的查找 假设目前表中的记录比较少所有的记录都可以被存放在一个页中在查找记录的时候可以根据搜索条件的不同分为两种情况 以主键为搜索条件 可以在页目录中使用二分法快速定位到对应的槽然后再遍历该槽对应分组中的记录即可快速找到指定的记录。 以其他列作为搜索条件 因为在数据页中并没有对非主键建立所谓的页目录所以我们无法通过二分法快速定位相应的槽。这种情况下只能从最小记录开始依次遍历单链表中的每条记录然后对比每条记录是不是符合搜索条件。很显然这种查找的效率是非常低的。 2.在很多页中查找 大部分情况下我们表中存放的记录都是非常多的需要好多的数据页来存储这些记录。在很多页中查找记录的话可以分为两个步骤 定位到记录所在的页。从所在的页内查找相应的记录。 在没有索引的情况下不论是根据主键列或者其他列的值进行查找由于我们并不能快速的定位到记录所在的页所以只能从第一个页沿着双向链表一直往下找在每一个页中根据我们上面的查找方式去查找指定的记录。因为要遍历所有的数据页所以这种方式显然是超级耗时的。 2.2 设计索引 mysql CREATE TABLE index_demo( - ) ROW_FORMAT Compact;123456 这个新建的index_demo表中有2个INT类型的列1个CHAR(1)类型的列而且我们规定了c1列为主键这个表使用Compact行格式来实际存储记录的。这里我们简化了index_demo表的行格式示意图 record_type记录头信息的一项属性表示记录的类型0表示普通记录、1表示目录项记录、2表示最小记录、3表示最大记录。next_record记录头信息的一项属性表示下一条地址相对于本条记录的地址偏移量我们用箭头来表明下一条记录是谁。各个列的值这里只记录在index_demo表中的三个列分别是c1、c2和c3。其他信息除了上述3种信息以外的所有信息包括其他隐藏列的值以及记录的额外信息。 将记录格式示意图的其他信息项暂时去掉并把它竖起来的效果就是这样 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9oQxhwPZ-1650187761507)(https://cdn.jsdelivr.net/gh/aoshihuankong/cloudimgmaster/img/202203301000365.png)] 把一些记录放到页里的示意图就是 1. 一个简单的索引设计方案 我们在根据某个搜索条件查找一些记录时为什么要遍历所有的数据页呢因为各个页中的记录并没有规律我们并不知道我们的搜索条件匹配哪些页中的记录所以不得不依次遍历所有的数据页。所以如果我们想快速的定位到需要查找的记录在哪些数据页中该咋办我们可以为快速定位记录所在的数据页而建立一个目录建这个目录必须完成下边这些事 下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值。给所有的页建立一个目录项。 以页28为例它对应目录项2这个目录项中包含着该页的页号28以及该页中用户记录的最小主键值5。我们只需要把几个目录项在物理存储器上连续存储比如数组就可以实现根据主键值快速查找某条记录的功能了。比如查找主键值为20的记录具体查找过程分两步 先从目录项中根据二分法快速确定出主键值为20的记录在目录项3中因为 12 20 209 它对应的页是页9。 再根据前边说的在页中查找记录的方式去页9中定位具体的记录。 至此针对数据页做的简易目录就搞定了。这个目录有一个别名称为索引。 2. InnoDB中的索引方案 ① 迭代1次目录项纪录的页 我们把前边使用到的目录项放到数据页中的样子就是这样 从图中可以看出来我们新分配了一个编号为30的页来专门存储目录项记录。这里再次强调目录项记录和普通的用户记录的不同点 目录项记录的record_type值是1而普通用户记录的record_type值是0。目录项记录只有主键值和页的编号两个列而普通的用户记录的列是用户自己定义的可能包含很多列另外还有InnoDB自己添加的隐藏列。了解记录头信息里还有一个叫min_rec_mask的属性只有在存储目录项记录的页中的主键值最小的目录项记录的min_rec_mask值为1其他别的记录的min_rec_mask值都是0。 **相同点**两者用的是一样的数据页都会为主键值生成Page Directory页目录从而在按照主键值进行查找时可以使用二分法来加快查询速度。 现在以查找主键为20的记录为例根据某个主键值去查找记录的步骤就可以大致拆分成下边两步 先到存储目录项记录的页也就是页30中通过二分法快速定位到对应目录项因为 12 20 209 所以定位到对应的记录所在的页就是页9。 再到存储用户记录的页9中根据二分法快速定位到主键值为20的用户记录。 ② 迭代2次多个目录项纪录的页 从图中可以看出我们插入了一条主键值为320的用户记录之后需要两个新的数据页 为存储该用户记录而新生成了页31。因为原先存储目录项记录的页30的容量已满我们前边假设只能存储4条目录项记录所以不得不需要一个新的页32来存放页31对应的目录项。 现在因为存储目录项记录的页不止一个所以如果我们想根据主键值查找一条用户记录大致需要3个步骤以查找主键值为20的记录为例 确定目录项记录页我们现在的存储目录项记录的页有两个即页30和页32又因为页30表示的目录项的主键值的范围是 [1, 320) 页32表示的目录项的主键值不小于 320 所以主键值为20的记录对应的目录项记录在页30中。 通过目录项记录页确定用户记录真实所在的页。在一个存储目录项记录的页中通过主键值定位一条目录项记录的方式说过了。 在真实存储用户记录的页中定位到具体的记录。 ③ 迭代3次目录项记录页的目录页 如图我们生成了一个存储更高级目录项的页33这个页中的两条记录分别代表页30和页32如果用户记录的主键值在[1, 320)之间则到页30中查找更详细的目录项记录如果主键值不小于320的话就到页32中查找更详细的目录项记录。 我们可以用下边这个图来描述它 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z32cBrxW-1650187761566)(https://cdn.jsdelivr.net/gh/aoshihuankong/cloudimgmaster/img/202203301040190.png)] 这个数据结构它的名称是B树。 ④ BTree 一个B树的节点其实可以分成好多层规定最下边的那层也就是存放我们用户记录的那层为第0层之后依次往上加。之前我们做了一个非常极端的假设存放用户记录的页最多存放3条记录存放目录项记录的页最多存放4条记录。其实真实环境中一个页存放的记录数量是非常大的假设所有存放用户记录的叶子节点代表的数据页可以存放100条用户记录所有存放目录项记录的内节点代表的数据页可以存放1000条目录项记录那么 如果B树只有1层也就是只有1个用于存放用户记录的节点最多能存放100条记录。如果B树有2层最多能存放1000×10010,0000条记录。如果B树有3层最多能存放1000×1000×1001,0000,0000条记录。如果B树有4层最多能存放1000×1000×1000×1001000,0000,0000条记录。相当多的记录 你的表里能存放100000000000条记录吗所以一般情况下我们用到的B树都不会超过4层那我们通过主键值去查找某条记录最多只需要做4个页面内的查找查找3个目录项页和一个用户记录页又因为在每个页面内有所谓的Page Directory页目录所以在页面内也可以通过二分法实现快速定位记录。 2.3 常见索引概念 1. 聚簇索引 特点 使用记录主键值的大小进行记录和页的排序这包括三个方面的含义 页内的记录是按照主键的大小顺序排成一个单向链表。 各个存放用户记录的页也是根据页中用户记录的主键大小顺序排成一个双向链表。 存放目录项记录的页分为不同的层次在同一层次中的页也是根据页中目录项记录的主键大小顺序排成一个双向链表。 B树的叶子节点存储的是完整的用户记录。 所谓完整的用户记录就是指这个记录中存储了所有列的值包括隐藏列。 优点 数据访问更快因为聚簇索引将索引和数据保存在同一个B树中因此从聚簇索引中获取数据比非聚簇索引更快聚簇索引对于主键的排序查找和范围查找速度非常快按照聚簇索引排列顺序查询显示一定范围数据的时候由于数据都是紧密相连数据库不用从多个数据块中提取数据所以节省了大量的io操作。 缺点 插入速度严重依赖于插入顺序按照主键的顺序插入是最快的方式否则将会出现页分裂严重影响性能。因此对于InnoDB表我们一般都会定义一个自增ID列为主键更新主键的代价很高因为将会导致被更新的行移动。因此对于InnoDB表我们一般定义主键为不可更新二级索引访问需要两次索引查找第一次找到主键值第二次根据主键值找到行数据 2. 二级索引辅助索引、非聚簇索引 概念回表 我们根据这个以c2列大小排序的B树只能确定我们要查找记录的主键值所以如果我们想根据c2列的值查找到完整的用户记录的话仍然需要到聚簇索引中再查一遍这个过程称为回表。也就是根据c2列的值查询一条完整的用户记录需要使用到2棵B树 3. 联合索引 我们也可以同时以多个列的大小作为排序规则也就是同时为多个列建立索引比方说我们想让B树按照c2和c3列的大小进行排序这个包含两层含义 先把各个记录和页按照c2列进行排序。 在记录的c2列相同的情况下采用c3列进行排序 注意一点以c2和c3列的大小为排序规则建立的B树称为联合索引本质上也是一个二级索引。它的意思与分别为c2和c3列分别建立索引的表述是不同的不同点如下 建立联合索引只会建立如上图一样的1棵B树。 为c2和c3列分别建立索引会分别以c2和c3列的大小为排序规则建立2棵B树。 2.4 InnoDB的B树索引的注意事项 1. 根页面位置万年不动 我们前边介绍B索引的时候为了大家理解上的方便先把存储用户记录的叶子节点都画出来然后接着画存储目录项记录的内节点实际上B树的形成过程是这样的 每当为某个表创建一个B树索引聚簇索引不是人为创建的默认就有的时候都会为这个索引创建一个根节点页面。最开始表中没有数据的时候每个B树索引对应的根节点中既没有用户记录也没有目录项记录。随后向表中插入用户记录时先把用户记录存储到这个根节点中。当根节点中的可用空间用完时继续插入记录此时会将根节点中的所有记录复制到一个新分配的页比如页a中然后对这个新页进行页分裂的操作得到另一个新页比如页b。这时新插入的记录根据键值也就是聚簇索引中的主键值二级索引中对应的索引列的值的大小就会被分配到页a或者页b中而根节点便升级为存储目录项记录的页。 这个过程特别注意的是一个B树索引的根节点自诞生之日起便不会再移动。这样只要我们对某个表建立一个索引那么它的根节点的页号便会被记录到某个地方然后凡是InnoDB存储引擎需要用到这个索引的时候都会从那个固定的地方取出根节点的页号从而来访问这个索引。 2. 内节点中目录项记录的唯一性 我们知道B树索引的内节点中目录项记录的内容是索引列页号的搭配但是这个搭配对于二级索引来说有点不严谨。还拿index_demo表为例假设这个表中的数据是这样的 c1c2c311‘u’31‘d’51‘y’71‘a’ 如果二级索引中目录项的内容只是索引号页号的搭配的话那么为c2列建立索引后的B树应该长这样 如果我们想要新插入一行记录其中c1、c2、c3的值分别是9、1、c那么在修改这个为c2列建立的二级索引对应的B树时便碰到了个大问题由于页3中存储的目录项记录是由c2列页号的值构成的页3中的两条目录项记录对应的c2列的值都是1那么我们这条新插入的记录到底应该放在页4中还是应该放在页5中啊答案是对不起懵了。 为了让新插入记录能找到自己在哪个页里我们需要**保证在B树的同一层内节点的目录项记录除页号这个字段以外是唯一的。**所以对于二级索引的内节点的目录项记录的内容实际上是由三个部分构成的 索引列的值主键值页号 也就是我们把主键值也添加到二级索引内节点中的目录项记录了这样就能保证B树每一层节点中各条目录项记录除页号这个字段外是唯一的所以我们为c2列建立二级索引后的示意图实际上应该是这样子的 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YE2lpMOm-1650187761575)(https://cdn.jsdelivr.net/gh/aoshihuankong/cloudimgmaster/img/202203301120304.png)] 这样我们再插入记录(9, 1, c)时由于页3中存储的目录项记录是由c2列主键页号的值构成的可以先把新记录的c2列的值和页3中各目录项记录的c2列的值作比较如果c2列的值相同的话可以接着比较主键值因为B树同一层中不同目录项记录的c2列主键的值肯定是不一样的所以最后肯定能定位唯一的一条目录项记录在本例中最后确定新记录应该被插入到页5中。 3. 一个页面最少可以存储2条记录 一个B树只需要很少的层级就可以轻松存储数亿条记录查询速度相当不错这是因为B树本质上就是一个大的多层级目录每经过一个目录时都会过滤掉许多无效的子目录直到最后访问的存储真实数据的目录。那如果一个大的目录中只存放一个子目录是个啥效果呢那就是目录层级非常非常非常多而且最后的那个存放真实数据的目录中存放一条记录。费了半天劲只能存放一条真实的用户记录所以InnoDB的一个数据页至少可以存放两条记录 3. MyISAM中的索引方案 B树索引适用存储引擎如表所示 索引/存储引擎MyISAMInnoDBMemoryB-Tree索引支持支持支持 即使多个存储引擎支持同一种类型的索引但是他们的实现原理也是不同的。Innodb和MyISAM默认的索引是Btree索引而Memory默认的索引是Hash索引。 MyISAM引擎使用BTree作为索引结构叶子节点的data域存放的是数据记录的地址。 3.1 MyISAM索引的原理 3.2 MyISAM 与 InnoDB对比 MyISAM的索引方式都是“非聚簇”的与InnoDB包含1个聚簇索引是不同的。 小结两种引擎中索引的区别 ① 在InnoDB存储引擎中我们只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录而在MyISAM中却需要进行一次回表操作意味着MyISAM中建立的索引相当于全部都是二级索引。 ② InnoDB的数据文件本身就是索引文件而MyISAM索引文件和数据文件是分离的索引文件仅保存数据记录的地址。 ③ InnoDB的非聚簇索引data域存储相应记录主键的值而MyISAM索引记录的是地址。换句话说InnoDB的所有非聚簇索引都引用主键作为data域。 ④ MyISAM的回表操作是十分快速的因为是拿着地址偏移量直接到文件中取数据的反观InnoDB是通过获取主键之后再去聚簇索引里找记录虽然说也不慢但还是比不上直接用地址去访问。 ⑤ InnoDB要求表必须有主键MyISAM可以没有。如果没有显式指定则MySQL系统会自动选择一个可以非空且唯一标识数据记录的列作为主键。如果不存在这种列则MySQL自动为InnoDB表生成一个隐含字段作为主键这个字段长度为6个字节类型为长整型。 4. 索引的代价 索引是个好东西可不能乱建它在空间和时间上都会有消耗 空间上的代价 每建立一个索引都要为它建立一棵B树每一棵B树的每一个节点都是一个数据页一个页默认会占用16KB的存储空间一棵很大的B树由许多数据页组成那就是很大的一片存储空间。 时间上的代价 每次对表中的数据进行增、删、改操作时都需要去修改各个B树索引。而且我们讲过B树每层节点都是按照索引列的值从小到大的顺序排序而组成了双向链表。不论是叶子节点中的记录还是内节点中的记录也就是不论是用户记录还是目录项记录都是按照索引列的值从小到大的顺序而形成了一个单向链表。而增、删、改操作可能会对节点和记录的排序造成破坏所以存储引擎需要额外的时间进行一些记录移位页面分裂、页面回收等操作来维护好节点和记录的排序。如果我们建了许多索引每个索引对应的B树都要进行相关的维护操作会给性能拖后腿。 5. MySQL数据结构选择的合理性 5.1 二叉搜索树 如果我们利用二叉树作为索引结构那么磁盘的IO次数和索引树的高度是相关的。 为了提高查询效率就需要减少磁盘IO数。为了减少磁盘IO的次数就需要尽量降低树的高度需要把原来“瘦高”的树结构变的“矮胖”树的每层的分叉越多越好。 5.2 AVL树 如果我们利用二叉树作为索引结构那么磁盘的IO次数和索引树的高度是相关的。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9e34Rx7-1650187761583)(https://cdn.jsdelivr.net/gh/aoshihuankong/cloudimgmaster/img/202203301635653.png)] 针对同样的数据如果我们把二叉树改成M 叉树M2呢当 M3 时同样的 31 个节点可以由下面的三叉树来进行存储 5.3 B-Tree B 树的结构如下图所示 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5RUwpYFG-1650187761588)(https://cdn.jsdelivr.net/gh/aoshihuankong/cloudimgmaster/img/202203301638995.png)] 一个 M 阶的 B 树M2有以下的特性 根节点的儿子数的范围是 [2,M]。 每个中间节点包含 k-1 个关键字和 k 个孩子孩子的数量 关键字的数量 1k 的取值范围为[ceil(M/2), M]。 叶子节点包括 k-1 个关键字叶子节点没有孩子k 的取值范围为 [ceil(M/2), M]。 假设中间节点节点的关键字为Key[1], Key[2], …, Key[k-1]且关键字按照升序排序即 Key[i] Key[i1]。此时 k-1 个关键字相当于划分了 k 个范围也就是对应着 k 个指针即为P[1], P[2], …,P[k]其中 P[1] 指向关键字小于 Key[1] 的子树P[i] 指向关键字属于 (Key[i-1], Key[i]) 的子树P[k]指向关键字大于 Key[k-1] 的子树。 所有叶子节点位于同一层。 上面那张图所表示的 B 树就是一棵 3 阶的 B 树。我们可以看下磁盘块 2里面的关键字为812它有 3 个孩子 (35)(910) 和 (1315)你能看到 (35) 小于 8(910) 在 8 和 12 之间而 (1315)大于 12刚好符合刚才我们给出的特征。 然后我们来看下如何用 B 树进行查找。假设我们想要查找的关键字是 9那么步骤可以分为以下几步 我们与根节点的关键字 (1735进行比较9 小于 17 那么得到指针 P1 按照指针 P1 找到磁盘块 2关键字为812因为 9 在 8 和 12 之间所以我们得到指针 P2 按照指针 P2 找到磁盘块 6关键字为910然后我们找到了关键字 9。 你能看出来在 B 树的搜索过程中我们比较的次数并不少但如果把数据读取出来然后在内存中进行比较这个时间就是可以忽略不计的。而读取磁盘块本身需要进行 I/O 操作消耗的时间比在内存中进行比较所需要的时间要多是数据查找用时的重要因素。B 树相比于平衡二叉树来说磁盘 I/O 操作要少在数据查询中比平衡二叉树效率要高。所以只要树的高度足够低IO次数足够少就可以提高查询性能。 再举例1 5.4 BTree B 树和 B 树的差异 有 k 个孩子的节点就有 k 个关键字。也就是孩子数量 关键字数而 B 树中孩子数量 关键字数1。 非叶子节点的关键字也会同时存在在子节点中并且是在子节点中所有关键字的最大或最小。 非叶子节点仅用于索引不保存数据记录跟记录有关的信息都放在叶子节点中。而 B 树中 非叶子节点既保存索引也保存数据记录。 所有关键字都在叶子节点出现叶子节点构成一个有序链表而且叶子节点本身按照关键字的大小从小到大顺序链接。 B 树和 B 树都可以作为索引的数据结构在 MySQL 中采用的是 B 树。 但B树和B树各有自己的应用场景不能说B树完全比B树好反之亦然。 思考题为了减少IO索引树会一次性加载吗 1、数据库索引是存储在磁盘上的如果数据量很大必然导致索引的大小也会很大超过几个G。 2、当我们利用索引查询时候是不可能将全部几个G的索引都加载进内存的我们能做的只能是逐一加载每一个磁盘页因为磁盘页对应着索引树的节点。 思考题B树的存储能力如何为何说一般查找行记录最多只需1~3次磁盘IO InnoDB存储引擎中页的大小为16KB一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节)指针类型也一般为4或8个字节也就是说一个页BTree中的一个节点中大概存储16KB/(8B8B)1K个键值因为是估算为了方便计算这里的K取值为103。也就是说一个深度为3的BTree索引可以维护103 * 10^3 * 10^3 10亿条记录。这里假定一个数据页也存储10^3条行记录数据了 实际情况中每个节点可能不能填充满因此在数据库中BTree的高度一般都在2~4层。MySQL的InnoDB存储引擎在设计时是将根节点常驻内存的也就是说查找某一键值的行记录时最多只需要1~3次磁盘I/O操作 思考题为什么说B树比B-树更适合实际应用中操作系统的文件索引和数据库索引 1.B树的磁盘读写代价更低 B树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对于B树更小。如果把所有同一内部结点的关键字存放在同一盘块中那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。 2、B树的查询效率更加稳定 由于非终结点并不是最终指向文件内容的节点而只是叶子结点中关键字的索引。所有任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同导致每一个数据的查询效率相当。 思考题Hash索引与B树索引的区别 1、Hash索引不能进行范围查询而B树可以。这是因为Hash索引指向的数据是无序的而B树的叶子节点是个有序的链表。 2、Hash索引不支持联合索引的最左侧原则即联合索引的部分索引无法使用而B树可以。对于联合索引来说Hash索引在计算Hash值的时候是将索引键合并后再一起计算Hash值所以不会针对每个索引单独计算Hash值。因此如果用到联合索引的一个或者几个索引时联合索引无法被利用。 3、Hash索引不支持 ORDER BY 排序因为Hash索引指向的数据是无序的因此无法起到排序优化的作用而B树索引数据是有序的可以起到对该字段ORDER BY 排序优化的作用。同理我们也无法用Hash索引进行模糊查询而B树使用LIKE进行模糊查询的时候LIKE后面后模糊查询比如%结尾的话就可以起到优化作用。 4、InnoDB不支持哈希索引
http://wiki.neutronadmin.com/news/333098/

相关文章:

  • 网站策划资料方案网站建设佰金手指科杰三
  • 长春建站推荐动漫设计师资格证
  • 网站建设与软件开发哪个好赚钱广东电白建设集团有限公司网站
  • 网站建设需要写语句吗上海本土互联网公司
  • 弄一个公司网站需要多少钱wordpress 地图热点功能
  • 天津做公司的网站腾讯会议多少钱一个月
  • 做推广可以在哪些网站发布软文高端品牌羽绒服
  • 门户网站 模板之家淄博企业网站建设有限公司
  • 网站推广seo优化网页设计制作软件
  • 四川平台网站建设方案优秀网页设计作品
  • 网站制作 佛山发布软文平台
  • 可以看禁止访问网站的浏览器erp软件是什么意思啊
  • 给个高质量的网站查询网站建立时间
  • 西宁做网站君博专注超市微信小程序怎么做
  • 用帝国cms做视频网站杭州企业名录大全
  • 深圳市城乡住房和建设局网站首页网站建设的公司上海
  • 滁州网站开发经典网站模板
  • 网站人多怎么优化wordpress 启用多站点
  • 易语言网站开发教程网站制作知名 乐云践新专家
  • 厦门最早做网站的公司网站建设的关键技术
  • 东莞做商城网站建设建设网站南昌
  • 网站高端设计公司哪家好学校英文网站建设
  • 茶山网站建设上海seo关键字推广
  • 一级域名 网站建设网页设计图片素材关于设计
  • 网站挣钱网手机排行榜最新
  • 营销型网站建设发难wordpress建站案例视频
  • 电商网站开发平台需要多少百度站长平台网站改版工具
  • 有没有免费的源码网站爱站网seo综合查询
  • 广东营销网站建设服务公司如何制作小程序卖东西
  • 网站优化建设方案产品展示网站模板php