BoyChai's Blog - 优化 https://blog.boychai.xyz/index.php/tag/%E4%BC%98%E5%8C%96/ zh-CN Tue, 05 Sep 2023 04:51:00 +0000 Tue, 05 Sep 2023 04:51:00 +0000 [MYSQL]SQL优化 https://blog.boychai.xyz/index.php/archives/64/ https://blog.boychai.xyz/index.php/archives/64/ Tue, 05 Sep 2023 04:51:00 +0000 BoyChai 插入数据
  • 批量插入数据推荐使用下面语句
INSERT INTO 表名(字段1,字段2,......) VALUES (值1,值2,......),(值1,值2,......),(值1,值2,......);
  • 如果数据量过于庞大,数据条数大于1000推荐使用文件导入的方式进行插入,方法如下
## 登录mysql的时候需要添加--local-infile参数
mysql --local-infile -u root -p
## 登录之后设置local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile=1;
## 使用load命令导入数据
load data local infile '文件' into table `表名` fields terminated by `文件里面的分隔符` lines terminated by '\n';

文件里面的内容格式如下

1,a,b,c
2,b,c,d

PS:主键顺序插入性能高于乱序插入

主键优化

  • 数据组织方式

在InnoDB存储引擎中,表数据都是根据逐渐顺序组织存放的,这种存储方式的表成为索引组织表(index organized table IOT)

  • 页分裂

页可以为空 ,也可以填充一半,也可以填充100%。每个页包含了2-N行数据(如果 一行数据多大,会溢出),根据主键排列。

  • 页合并

当删除一条记录时,实际上记录并没有被物理删除,只是被标记(flaged)为啥暗处并且他的空间变得允许被其他记录声明使用。当页面中删除的记录达到MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后)看看是否可以将两个页合并已优化空间使用。

  • 主键设置原则
  1. 满足业务要求的情况下,尽量降低主键长度。
  2. 插入数据的时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键。
  3. 尽量不要使用UUID做主键或者是其他自然主键,如身份证。
  4. 业务操作时,避免对主键的修改。

order by优化

  • Using filesort

通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort排序。

  • Using index

通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率更高。

  • 优化
  1. 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。
  2. 尽量使用覆盖索引。
  3. 多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)
  4. 如果不可避免出现filesort,大数据量排序时,可以适当增大排序缓冲区大小sort_buffer_size(默认256k)。

group by优化

  • 分组操作时,可以通过索引来提高效率。
  • 分组操作时,索引的使用也是满足最左前缀法则的。

limit优化

一般分页查询时,通过创建 覆盖索引 能够比较好的提高性能,可以通过覆盖索引加子查询形式进行优化。

count优化

  • 在MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高。
  • InnoDB引擎就麻烦了,他执行count(*)的时候,需要把数据一行一行的从引擎里面读出来,让后累计计数。
  • count(主键)

InnoDB引擎会遍历整张表,把每一行的主键id值都取出来,返回给服务层。服务层拿到主键后,直接按行累加(主键不可能为null)。

  • count(字段)

没有not null约束时: InnoDB疫情会便利整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。

有not null约束时: InnoDB疫情会便利整张表把每一行的字段值都取出来,返回给服务层们直接按行进行累加。

  • count(1)

InnoDB疫情遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行累加。

  • count(*)

InnoDB疫情并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。

  • 优化方案

    1. 可以自己做count,使用缓存数据库做这类工作。
    2. 按照效率排序的话,count(字段)<count(主键)<count(1)≈count(*),所以尽量使用count(*)。

update优化

InnoDB的行锁是针对索引加的锁,不是针对记录家的锁,并且该索引不能失效,否则会从行锁升级为表锁。规避这种情况就需要在对应字段创建索引。

]]>
0 https://blog.boychai.xyz/index.php/archives/64/#comments https://blog.boychai.xyz/index.php/feed/tag/%E4%BC%98%E5%8C%96/
Jenkins-持续性集成平台(平台优化) https://blog.boychai.xyz/index.php/archives/14/ https://blog.boychai.xyz/index.php/archives/14/ Wed, 01 Jun 2022 08:25:00 +0000 BoyChai 更换插件源

进入到Jenkins里面依次点击Manage Jenkins(系统管理) -> Plugin Manager(插件管理) -> Advanced(高级)之后修改Update Site(升级站点)选项的地址,默认地址为:https://updates.jenkins.io/update-center.json是jenkins的官方插件源,下载插件会很慢,建议使用国内的,这里把我他替换成清华大学的源地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json,更换好后需要点击submit保存一下之后重启jenkins

换源

切换中文

插件名称:Localization: Chinese (Simplified)

在Plugin Manager(插件管理)界面点击Available(可选插件),搜索Chinese之后勾选复选框点击"Install without restart"即可安装,这个插件安装好需要重启才可以生效。

中文插件

安装过程中点击Restart Jenkins那个复选框即可

自动重启

效果图

权限管理

插件名称:Role-based Authorization Strategy

默认jenkins是没有做用户权限这块的内容的,所以需要这个插件。在Plugin Manager(插件管理)界面点击Available(可选插件),搜索Role-based之后勾选复选框点击"Install without restart"即可安装。安装好之后依次点击Manage Jenkins(系统管理) -> Configure Global Security(全局安全配置),找到授权策略,选择"Role-Based Strategy"项,保存。

效果图

之后依次点击 Manage Jenkins(系统管理) -> Manage and Assign Roles(管理和分配角色) -> Manage Roles(管理角色)。

效果图

角色(Roles)就可以理解为权限组,进入之后会有三种角色类型,如下表

角色类型作用
Global Roles平台全局的权限
Item Roles针对项目的权限
Node RolesJenkins的节点权限

关于角色的权限信息对照

全面

权限作用
Administer系统管理员权限
Read浏览框架(登录)

代理

权限作用
Build该权限允许用户在代理上允许任务。
Configure该权限允许用户配置代理。
Connect该权限允许用户连接代理或者让代理上线。
Create该权限允许用户创建代理。
Delete该权限允许用户删除已存在的代理。
Disconnect该权限允许用户断开或者临时下线代理。
Provision设置新节点

任务

权限作用
Build该权限允许启动一个新的构建任务。
Cancel该权限允许取消计划或终止运行中的构建任务。
Configure修改任务的配置。
Create创建新的任务。
Delete删除任务。
Discover该权限允许查找任务。比读取的权限低,当用户试图访问任务时会重定向到登录页面。如果没有该权限,就不能查找工程名称,并会得到404错误。
Read查看任务。(可以拒绝该权限,但允许发现,迫使匿名用户登录到看到任务)
Workspace该权限允许获取 Jenkins 执行构建任务时检出的工作空间内容。如果你不希望用户通过工作空间浏览器访问工作空间中的文件(例如: SCM 检出的源码或者构建的中间产物),你可以取消该权限。

视图

权限作用
Configure该权限允许用户改变视图的配置。
Create该权限允许用户创建新的视图。
Delete该权限允许用户删除已有的视图。
Read该权限允许用户查看视图(允许读取访问)。

这里我创建了两个角色一个全局的一个项目的,分配的权限如下图,其中item的角色添加会有一个pattern的一个项,这里面是写正则表达式的,”item01.*“的意思为前缀以item01的项目。最后点击save(保存)

效果图

角色创建好之后我们创建一个用户测试一下,依次点击Manage Jenkins(系统管理) -> Manage Users(管理用户) -> Create User(新建用户),创建好之后如下图

效果图

之后依次点击 Manage Jenkins(系统管理) -> Manage and Assign Roles(管理和分配角色) -> Assign Roles(指派角色)。把创建的角色添加到全局和项目角色里面,并且勾选刚才创建的角色组里面。记得点击Save(保存)。

效果图

此时我们创建一个item01的项目,依次点击New Item(新建任务) -> 输入item01 -> 点击"构建一个自由风格的软件项目" -> OK(确定) -> Save(保存)

效果图

此时我们就创建了一个项目,如下图

效果图

这个时候退出管理员登录刚才创建的用户,效果如下

效果图

凭证管理

插件名称:Credentials Binding

在使用jenkins的时候会有很多的项目需要去pull,会涉及到很多账户的管理,默认jenkins是不提供这方面的管理的。依次点击 Manage Jenkins(系统管理) -> Manage Credentials(凭据) -> global

-> Add Credentials(添加凭据) 可以进行对凭据的管理

效果图

类型分别为,Username with password(用户名和密码)、SSH Username with private key(具有私钥的SSH用户名)、Secret file(机密文件)、Secret text(机密文本)、Certificate(证书)

效果图

GIT插件

插件名称:Git

安装之前请确保系统里有git这个工具,jenkins的docker会自带git。jenkins默认是没有git克隆代码这个能力的,这个插件完美解决了这个问题。

在项目配置里找到源码管理选择git并添加代码仓库地址保存,例如下图

效果图

之后我们运行构建一下,查看一下状态,如下图

效果图

]]>
0 https://blog.boychai.xyz/index.php/archives/14/#comments https://blog.boychai.xyz/index.php/feed/tag/%E4%BC%98%E5%8C%96/