BoyChai's Blog - 优化 https://blog.boychai.xyz/index.php/tag/%E4%BC%98%E5%8C%96/ [MYSQL]SQL优化 https://blog.boychai.xyz/index.php/archives/64/ 2023-09-05T04:51:00+00:00 插入数据批量插入数据推荐使用下面语句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,dPS:主键顺序插入性能高于乱序插入主键优化数据组织方式在InnoDB存储引擎中,表数据都是根据逐渐顺序组织存放的,这种存储方式的表成为索引组织表(index organized table IOT)页分裂页可以为空 ,也可以填充一半,也可以填充100%。每个页包含了2-N行数据(如果 一行数据多大,会溢出),根据主键排列。页合并当删除一条记录时,实际上记录并没有被物理删除,只是被标记(flaged)为啥暗处并且他的空间变得允许被其他记录声明使用。当页面中删除的记录达到MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后)看看是否可以将两个页合并已优化空间使用。主键设置原则满足业务要求的情况下,尽量降低主键长度。插入数据的时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键。尽量不要使用UUID做主键或者是其他自然主键,如身份证。业务操作时,避免对主键的修改。order by优化Using filesort通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort排序。Using index通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率更高。优化根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。尽量使用覆盖索引。多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)如果不可避免出现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疫情并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。优化方案可以自己做count,使用缓存数据库做这类工作。按照效率排序的话,count(字段)<count(主键)<count(1)≈count(*),所以尽量使用count(*)。update优化InnoDB的行锁是针对索引加的锁,不是针对记录家的锁,并且该索引不能失效,否则会从行锁升级为表锁。规避这种情况就需要在对应字段创建索引。 Jenkins-持续性集成平台(平台优化) https://blog.boychai.xyz/index.php/archives/14/ 2022-06-01T08:25:00+00:00 更换插件源进入到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并添加代码仓库地址保存,例如下图之后我们运行构建一下,查看一下状态,如下图