MySQL性能调优与设计——MySQL中的索引

news2024/11/18 7:46:00

MySQL中的索引

InnoDB存储引擎支持以下几种常见索引:B+树索引、全文索引、哈希索引,其中比较关键的是B+树索引。

B+树索引

InnoDB中的索引自然也是按照B+树来组织的,B+树的叶子节点用来存放数据。

聚集索引/聚簇索引

InnoDB中使用了聚集索引,就是将表的主键用来构造一棵B+树,并且将整张表的行记录数据存放在改B+树的叶子节点中,也就是所谓的索引即数据,数据即索引。由于聚集索引是利用表的主键构建的,所以每张表只能拥有一个聚集索引。

聚集索引的叶子节点就是数据页,数据页上存放的是完整的每行记录。因此聚集索引的一个优点就是:通过聚集索引能获取完整的整行数据。另一个优点是:对于主键的排序查找和范围查找速度很快。

image.png
image.png
image.png

如果表中没有定义主键呢?MySQL会使用唯一性索引,没有唯一性索引,MySQL也会创建一个隐含列rowId来做主键,然后用这个主键来建立聚集索引。

辅助索引/二级索引

聚簇索引只能在搜索条件是主键值时才能发挥作用,因为B+树中的数据都是按照主键进行排序的。

如果想以别的列作为搜索条件,一般会建立其他列的多个索引,这些索引被称为辅助索引/二级索引。(每建立一个索引,就有一棵B+树)

对于辅助索引(Secondary Index,也称二级索引、非聚集索引),叶子节点并不含行记录的全部数据,叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含了一个书签(bookmark)。该书签用来告诉InnoDB存储引擎哪里可以找到与索引相对应的行数。因此InnoDB存储引擎的辅助索引的书签就是相应行数据的聚集索引键

image.png
比如辅助索引index(nodt),那么叶子节点中包含的数据就包括了(note和主键)。
image.png

回表

辅助索引的存在并不影响数据在聚集索引中的组织,因此每张表上可以有多个辅助索引。当通过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键,然后通过主键索引(聚集索引)来找到一个完整的行记录。这个过程也被成为回表,就是根据辅助索引的值查询一条完整的用户记录需要使用2棵B+树(一棵辅助索引,一次聚集索引)。
image.png

  • 为什么还需要一次回调操作?直接把完整的用户记录放到辅助索引的叶子节点不好吗?
    • 如果把完整的用户记录放到叶子节点是可以不用回表,但是太占地方了,相当于每建立一棵B+树都需要把所有的用户记录再都拷贝一遍,太浪费存储空间。
    • 每次对数据的变化要在所有包含数据的索引中全部修改一次,修改的性能也非常低下。

很明显,回表的记录越少,性能提升就越高,需要回表的记录越多,使用二级索引的性能就越低,甚至某些查询宁愿使用权标扫描也不使用二级索引。

联合索引/复合索引

将表上的多个列组合起来进行索引称为联合索引/复合索引,比如index(a,b)就是将a,b两个列组合起来构成一个索引。

建立联合索引只会建立1棵B+树,多个列分别建立索引会分别以每个列建立B+树,有几个列就有几个B+树,比如index(note),index(b),就分别对note,b两个列各构建了一个索引。

  • 如果是index(note,b)在索引构建上,包含了两个意思:
    • 先把各个记录按照note列进行排序。
    • 在记录的note列相同的情况下,采用b列进行排序。

从原理可知,为什么有最佳左前缀法则,就是这个道理。
image.png

覆盖索引

既然多个列可以组合起来构建为联合索引,那么辅助索引自然也可以由多个列组成。

InnoDB存储引擎支持覆盖索引(covering index,或称索引覆盖),即从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录(回表)。使用覆盖索引的一个好处是辅助索引不包含整行记录的所有信息,所以其大小远小于聚集索引,因为可以减少大量的IO操作。覆盖索引并不是索引类型的一种
image.png

哈希索引

InnoDB存储引擎除了前面所说的各种索引,还有一种自适应哈希索引。我们知道B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般为3,4层,故需要3,4次的IO查询。

在InnoDB存储引擎内部自己去监控索引表,如果监控到某个索引经常用,那么就认为是热数据,然后内部自己创建一个hash索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)创建以后,如果下次又查询到这个索引,那么直接通过hash算法推导出记录的地址,直接一次就能查询到数据,比重复去B+树索引中查询三四次节点的效率高不少。

InnoDB存储引擎使用的哈希函数采用除法散列方式,其冲突机制采用链表方式。注意,对于自适应哈希索引仅是数据库自身创建并使用,我们不能对其进行干预。

哈希索引只能用来搜索等值的查询,如select * from table where index co=xxx。而对于其他查找类型,如范围查找,是不能使用哈希索引的。

innodb_adaptive_hash_index来考虑是禁用或启动此特性,默认AHI为开启状态。
image.png

全文索引

全文索引(Full-Text Search),它是将存储于数据库中的整本书或整篇文章中的任意内心信息查找出来的技术。它可以根据需要获得全文中有关章、节、段、句、词等信息,也可以进行各种统计和分析。Elasticsearch、Solr等就是全文检索引擎,底层都是基于Apache Lucene的。

举个例子,现在要保存唐宋诗词,数据库的表设计可能如下:

朝代作者诗词年代标题诗词全文
李白静夜思床前明月光,疑是地上霜。 举头望明月,低头思故乡。
李清照如梦令常记溪亭日暮,沉醉不知归路,兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

要根据朝代或者作者寻找诗,都很简单,比如select 诗词全文 from 诗词表 where 作者 = '李白',如果数据很多,可以在对应的查询字段上建立索引加速查询。

但是如果有个需求:要求找到包含“望”字的诗词。用select 诗词全文 from 诗词表 where诗词全文 like‘%望%,这意味着要扫描数据库中的诗词全文字段,逐条对比,找出所有包含关键字“望”字的记录。基本上,数据库中一般SQL优化手段都用不上。数量少,大概性能还能接受,如果数据量稍微大点,就完全无法接受了,更何况在互联网这种海量数据的情况下呢?怎么解决这个问题呢,用倒排索引。

倒排索引就是,将文档中包含的关键字全部提取处理,然后再将关键字和文档之间的对应关系保存起来,最后再对关键字本身做索引排序。用户在检索某一个关键字是,先对关键字的索引进行查找,再通过关键字与文档的对应关系找到所在文档。

于是我们可以这么保存

序号关键字蜀道难静夜思春台望鹤冲天
1

如果查哪个诗词中包含“上”,上述的表格可以继续填入新的记录

序号关键字蜀道难静夜思春台望鹤冲天
1
2

从InnoDB 1.2.x版本开始,InnoDB存储引擎开始支持全文检索,对应的MySQL版本是5.6.x系列。不过MySQL从设计之初就是关系型数据库,存储引擎虽然支持全文检索,整体架构上对全文检索支持并不好而且限制很多,比如每张表只能有一个全文检索的索引,不支持没有单词界定符( delimiter)的语言,如中文、日语、韩语等。

所以MySQL中的全文索引功能比较弱鸡,了解即可。

索引在查询中的使用

  • 一个索引就是一个B+树,索引让我们的查询可以快速定位和扫描到我们需要的数据记录上,加快查询速度。
  • 一个select查询语句在执行过程中一般最多能使用一个二级索引,即使在where条件中用了多个二级索引。

高性能的索引创建策略

正确地创建和使用索引是实现高性能查询的基础。

索引列的类型尽量小

我们在定义表结构的时候要显式的指定列的类型,以整数类型为例,有TTNYINT、NEDUMNT、INT、BIGTNT这么几种,它们占用的存储空间依次递增,我们这里所说的类型大小指的就是该类型表示的数据范围的大小。能表示的整数范围当然也是依次递增,如果我们想要对某个整数列建立索引的话,在表示的整数范围允许的情况下,尽量让索引列使用较小的类型,比如我们能使用INT就不要使用BIGINT,能使用NEDIUMINT就不要使用INT,这是因为数据类型越小,在查询时进行的比较操作越快(CPU层次)数据类型越小,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录,从而减少磁盘/0带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率。

这个建议对于表的主键来说更加适用,因为不仅是聚簇索引中会存储主键值,其他所有的二级索引的节点处都会存储一份记录的主键值,如果主键适用更小的数据类型,也就意味着节省更多的存储空间和更高效的I/0。

索引的选择性

创建索引应该 选择性(离散性) 高的列。索引的 选择性(离散性)是指,不重复的索引值(也称为基数)/数据表的记录总数(N)的比值,范围从1/N到1之间。索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

很差的索引选择性就是列中的数据重复度很高,比如性别字段,不考虑政治正确的情况下,只有两种可能,男或女。在查询时,即使使用这个索引,从概率的角度来说,依然可能查出一半的数据出来。
image.png

哪列做为索引字段最好?当然是姓名字段,因为里面的数据没有任何重复,性别字段是最不适合做索引的,因为数据的重复度非常高。

怎么算索引的选择性/离散性?比如person这个表:

SELECT count(DISTINCT name)/count(*) FROM person;
SELECT count(DISTINCT sex)/count(*) FROM person;
SELECT count(DISTINCT age)/count(*) FROM person;
SELECT count(DISTINCT  area)/count(*) FROM person;

前缀索引

针对blob、text、很长的varchar字段,mysql不支持索引他们的全部长度,需建立前缀索引。

语法:Alter table tableName add key/index (column(X))

**缺点:**前缀索引是一种能使索引更小、更快的有效办法,但另一方面也有其缺点MySQL无法使用前缀索引做ORDER BY和GROUP BY,也无法使用前缀索引做覆盖扫描。

有时候后缀索引 (suffix
index)也有用途(例如,找到某个域名的所有电子邮件地址)。MySQL原生并不支持反向索引,但是可以把字符串反转后存储,并基于此建立前缀索引。可以通过触发器或者应用程序自行处理来维护索引。

案例:
image.png
image.png
image.png
首先找到最常见的值的列表:

SELECT COUNT(DISTINCT LEFT(order_note,3))/COUNT(*) AS sel3,
COUNT(DISTINCT LEFT(order_note,4))/COUNT(*)AS sel4,
COUNT(DISTINCT LEFT(order_note,5))/COUNT(*) AS sel5,
COUNT(DISTINCT LEFT(order_note, 6))/COUNT(*) As sel6,
COUNT(DISTINCT LEFT(order_note, 7))/COUNT(*) As sel7,
COUNT(DISTINCT LEFT(order_note, 8))/COUNT(*) As sel8,
COUNT(DISTINCT LEFT(order_note, 9))/COUNT(*) As sel9,
COUNT(DISTINCT LEFT(order_note, 10))/COUNT(*) As sel10,
COUNT(DISTINCT LEFT(order_note, 11))/COUNT(*) As sel11,
COUNT(DISTINCT LEFT(order_note, 12))/COUNT(*) As sel12,
COUNT(DISTINCT LEFT(order_note, 13))/COUNT(*) As sel13,
COUNT(DISTINCT LEFT(order_note, 14))/COUNT(*) As sel14,
COUNT(DISTINCT LEFT(order_note, 15))/COUNT(*) As sel15,
COUNT(DISTINCT order_note)/COUNT(*) As total
FROM order_exp;

image.png

从第10个开始选择性的增加值很高,随着前缀字符的越来越多,选择度也在不断上升,但是增长到第15时,已经和第14没太大差别了,选择性提升的幅度已经很小了,都非常接近整个列的选择性了。

那么针对这个字段做前缀索引的话,从第13到第15都是不错的选择

在上面的示例中,已经找到了合适的前缀长度,如何创建前缀索引:

ALTER TABLE order_exp ADD KEY (order_note(14));

建立前缀索引后查询语句并不需要更改:

select * from order_exp where order_note = 'xxxx' ;

前缀索引是一种能使索引更小、更快的有效办法,但另一方面也有其缺点MySQL无法使用前缀索引做ORDER BY和GROUP BY,也无法使用前缀索引做覆盖扫描。

有时候后缀索引 (suffix index)也有用途(例如,找到某个域名的所有电子邮件地址)。MySQL原生并不支持反向索引,但是可以把字符串反转后存储,并基于此建立前缀索引。可以通过触发器或者应用程序自行处理来维护索引。

只为用于搜索、排序或分组的列创建索引

也就是说,只为出现在WHERE 子句中的列、连接子句中的连接列创建索引,而出现在查询列表中的列一般就没必要建立索引了,除非是需要使用覆盖索引;又或者为出现在ORDER BY或GROUP BY子句中的列创建索引,这句话什么意思呢?比如:

搜索

select order_note from … and …

只为 条件中的列建立索引即可

排序

SELECT * FROM order_exp ORDER BY insert_time, order_status,expire_time;

image.png
查询的结果集需要先按照insert_time值排序,如果记录的insert_time值相同,则需要按照order_status来排序,如果order_status的值相同,则需要按照expire_time排序。回顾一下联合索引的存储结构,u_idx_day_status索引本身就是按照上述规则排好序的,所以直接从索引中提取数据,然后进行回表操作取出该索引中不包含的列就好了。

image.png

多列索引

很多人对多列索引的理解都不够。一个常见的错误就是,为每个列创建独立的索引,或者按照错误的顺序创建多列索引。

我们遇到的最容易引起困惑的问题就是索引列的顺序。正确的顺序依赖于使用该索引的查询,并且同时需要考虑如何更好地满足排序和分组的需要。反复强调过,在一个多列B-Tree索引中,索引列的顺序意味着索引首先按照最左列进行排序,其次是第二列,等等。所以,索引可以按照升序或者降序进行扫描,以满足精确符合列顺序的ORDER BY、GROUP BY和DISTINCT等子句的查询需求。

所以多列索引的列顺序至关重要。对于如何选择索引的列顺序有一个经验法则:将选择性最高的列放到索引最前列。当不需要考虑排序和分组时,将选择性最高的列放在前面通常是很好的。这时候索引的作用只是用于优化WHERE条件的查找。在这种情况下,这样设计的索引确实能够最快地过滤出需要的行,对于在WHERE子句中只使用了索引部分前缀列的查询来说选择性也更高。

然而,性能不只是依赖于索引列的选择性,也和查询条件的有关。可能需要根据那些运行频率最高的查询来调整索引列的顺序,比如排序和分组,让这种情况下索引的选择性最高。

同时,在优化性能的时候,可能需要使用相同的列但顺序不同的索引来满足不同类型的查询需求。

三星索引

三星索引概念

对于一个查询而言,一个三星索引,可能是其最好的索引。

满足的条件如下:

  • 索引将相关的记录放到一起则获得一星 (比重27%)
  • 如果索引中的数据顺序和查找中的排列顺序一致则获得二星(排序星) (比重23%)
  • 如果索引中的列包含了查询中需要的全部列则获得三星(宽索引星) (比重50%)

这三颗星,哪颗最重要?第三颗星。因为将一个列排除在索引之外可能会导致很多磁盘随机读(回表操作)。第一和第二颗星重要性差不多,可以理解为第三颗星比重是50%,第一颗星为27%,第二颗星为23%,所以在大部分的情况下,会先考虑第一颗星,但会根据业务情况调整这两颗星的优先度。

一星:

一星的意思就是:如果一个查询相关的索引行是相邻的或者至少相距足够靠近的话,必须扫描的索引片宽度就会缩至最短,也就是说,让索引片尽量变窄,也就是我们所说的索引的扫描范围越小越好。

二星(排序星)

在满足一星的情况下,当查询需要排序,group by、 order by,如果查询所需的顺序与索引是一致的(索引本身是有序的),是不是就可以不用再另外排序了,一般来说排序可是影响性能的关键因素。

三星(宽索引星)

在满足了二星的情况下,如果索引中所包含了这个查询所需的所有列(包括 where 子句和 select 子句中所需的列,也就是覆盖索引),这样一来,查询就不再需要回表了,减少了查询的步骤和IO请求次数,性能几乎可以提升一倍。

设计三星索引实战

现在有表,SQL如下

CREATE TABLE customer (
	cno INT,
	lname VARCHAR (10),
	fname VARCHAR (10),
	sex INT,
	weight INT,
	city VARCHAR (10)
);

CREATE INDEX idx_cust ON customer (city, lname, fname, cno);

对于下面的SQL而言,这是个三星索引

select cno,fname from customer where lname=’xx’ and city =’yy’ order by fname;

来评估下:
第一颗星:所有等值谓词的列,是组合索引的开头的列,可以把索引片缩得很窄,符合。
根据之前讲过的联合索引,我们是知道条件已经把搜索范围搜到很窄了
image.png

第二颗星:order by的fname字段在组合索引中且是索引自动排序好的,符合。
第三颗星:select中的cno字段、fname字段在组合索引中存在,符合。

现在有表,SQL如下:

CREATE TABLE `test` (
	`id` INT (11) NOT NULL AUTO_INCREMENT,
	`user_name` VARCHAR (100) DEFAULT NULL,
	`sex` INT (11) DEFAULT NULL,
	`age` INT (11) DEFAULT NULL,
	`c_date` datetime DEFAULT NULL,
	PRIMARY KEY (`id`),

) ENGINE = INNODB AUTO_INCREMENT = 12 DEFAULT CHARSET = utf8;

SQL语句如下:

select user_name,sex,age from test where user_name like 'test%'  and sex =1 ORDER BY age

如果我们建立索引(user_name,sex,age):
image.png
image.png
image.png
第三颗星,满足

第一颗星,满足

第二颗星,不满足,user_name 采用了范围匹配,sex 是过滤列,此时age 列无法保证有序的。

上述我们看到,此时索引(user_name,sex,age)并不能满足三星索引中的第二颗星(排序)。

于是我们改改,建立索引(sex, age,user_name):
image.png
第一颗星,不满足,只可以匹配到sex,sex选择性很差,意味着是一个宽索引片(同时因为age也会导致排序选择的碎片问题)

第二颗星,满足,等值sex 的情况下,age是有序的,

第三颗星,满足,select查询的列都在索引列中,

对于索引(sex,age,user_name)我们可以看到,此时无法满足第一颗星,窄索引片的需求。

以上2个索引,都是无法同时满足三星索引设计中的三个需求的,我们只能尽力满足2个。而在多数情况下,能够满足2颗星,已经能缩小很大的查询范围了,具体最终要保留那一颗星(排序星 or 窄索引片星),这个就需要看查询者自己的着重点了,无法给出标准答案。

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

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

相关文章

LeetCode 141. 环形链表

原题链接 难度:easy\color{Green}{easy}easy 题目描述 给你一个链表的头节点 headheadhead ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 nextnextnext 指针再次到达,则链表中存在环。 为了表示给定链表中的…

python编写webapi读取mdb数据使用json格式响应客户端请求

想做个自动应答机器人,通过webapi提供服务,原理:判断关键字,到数据库查询相关内容,以json格式反馈给客户端。 1、创建autoreply数据库,创建reply表,表中包含kename(短文本&#xff…

积水在线监测仪——积水点、易涝点水位监测设备

一、设备概述 积水在线监测仪是一款用于城市积水点、易涝点等场景的水位监测设备,设备采用电池供电,无需另外供电,安装方便,使用简单。可以时监测水点、易涝点水位情况,当水位数据超过阈值后触发告警上传,…

MybatisPlus实现分页效果并解决错误:cant found IPage for args!

前言 早就知道MybatisPlus对分页进行了处理,但是一直没有实战用过,用的是自己封装的一个分页组件,虽不说麻烦吧,但是也不是特别简单。 写起来还是比较复杂,但是最近这个组件有了点小小的bug,我决定是时候…

2023年进入互联网行业好找工作吗?

俗话说:选择大于努力。年后求职小高峰,大家在找工作的时候选择肯定也多了。 说真,不是人人都有铁饭,普通家庭的孩子想要在2023年进入互联网行业去找工作可能吗? 01 有一点大家要清楚,2022年是进入过一个寒…

【Linux】变量定义规则、shell 格式、空格注意事项汇总

文章目录1. 空格问题号用于赋值用于比较2. 变量2.1 变量命名的格式要求2.2、shell变量中的注意事项2.3、变量的使用方法2.4、变量的类型(1)自定义变量(2)环境变量(3)位置变量(4)预定…

【高并发-用户中心】读多写少的系统如何优化

本博客纯属个人总结,非原创。喜欢技术交流的,可关注博主,武汉有后端开发群,可支持内推,了解武汉行情等。 如何对读多写少的系统进行高并发优化? 比如:用户中心是一个读多写少的系统&#xff0…

Linux定时备份MySql数据库

一、创建文件 cd / mkdir mysqlbackup vi mysqlbackup.sh然后将下面的代码更改后复制上去即可。 #!/bin/bash mysqldump -uroot -ppassword database > /mysqlbackup/database__$(date %Y%m%d_%H%M%S).sqlpassword指的是MySql的密码,database指的是所要备份的…

【C++算法】dfs深度优先搜索(上) ——【全面深度剖析+经典例题展示】

💃🏼 本人简介:男 👶🏼 年龄:18 📕 ps:七八天没更新了欸,这几天刚搞完元宇宙,上午一直练🚗,下午背四级单词和刷题来着,还在忙一些学弟…

leaflet: 禁止拖拽、禁止zoom(双击、滚轮、键盘)、禁止tap(076)

第076个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中设定各种禁止状态,这里设置了禁止拖拽、禁止zoom(双击、滚轮、键盘)、禁止tap。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共73行)相关A…

linux高级命令之多进程的使用

多进程的使用学习目标能够使用多进程完成多任务1 导入进程包#导入进程包import multiprocessing2. Process进程类的说明Process([group [, target [, name [, args [, kwargs]]]]])group:指定进程组,目前只能使用Nonetarget:执行的目标任务名…

电商导购CPS,京东联盟如何跟单实现用户和订单绑定

前言 大家好,我是小悟 做过自媒体的小伙伴都知道,不管是发图文还是发短视频,直播也好,可以带货。在你的内容里面挂上商品,你自己都不需要囤货,如果用户通过这个商品下单成交了,自媒体平台就会…

【刷题笔记】--搜索二维矩阵 II

题目: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16…

设计师都在看的全球设计网站,你居然还不知道!

设计师需要拥有无限的创意和熟练的技巧,并且对行业的前景和客户的心理有一定的了解。要能达到“陌生化”之前,肯定是有知识储备,专业能力的前提要求,以及创新能力。 今天为大家整理了多个优秀全球设计网站,这些博客内…

大家都在聊的自动化办公到底是什么?

自动化办公无非是excel、ppt、word、邮件、文件处理、数据分析处理、爬虫这些,下面就详细介绍一下!文章最后分享了很不错的python学习教程,适合零基础初学的小伙伴,希望可以对你有所帮助!! excel自动化 我…

linux基本功系列之grep命令

文章目录前言一. grep命令介绍二. 语法格式及常用选项三. 参考案例3.1 搜索文件中以root开头的文件3.2 搜索文件中出现的root3.3 搜索除了匹配行之外的行3.4 匹配的部分使用颜色显示3.5 只输出文件中匹配到的地方3.6 输出包含匹配字符串的行,并显示所在的行数3.7 统…

Unity CircleLayoutGroup 如何实现一个圆形自动布局组件

文章目录简介实现原理Editor 编辑器简介 Unity中提供了三种类型的自动布局组件,分别是Grid Layou Group、Horizontal Layout Group、Vertical Layout Group,本文自定义了一个圆形的自动布局组件Circle Layout Group,如图所示: Ra…

Maven的安装步骤(保姆级安装教程)

一、安装本地Maven 选择你需要的maven版本下载:官网下载传送门 我使用的是3.6.1版本:maven-3.6.1-bin.zip 二、安装 把下载好的maven压缩包解压到一个没有中文,空格或其他特殊字符的文件夹,如: 三、配置环境变量…

Python 编程必备:盘点nginx和gunicorn的几大用法,建议收藏

程序员是新兴技术工种中比较高薪的一个,在互联网公司,程序员往往与秃头,压力大,找不到女朋友等等挂钩。 最近,最新技能类榜单出炉,这是一个关于程序员自己给自己贴的几个标签。 其中,不难看出…

美国CPC认证是什么?儿童玩具亚马逊CPC认证审核有哪些问题?

很多卖家都有遭遇listing下架,被要求提供CPC认证报告。这是因为亚马逊有时会加强对儿童产品的审查。本文带大家对CPC认证进行一个全面了解。什么是CPC认证?CPC认证,全称ChildrensProductCertification.是认可实验室,根据产品不同适…