Stuartd's Blog


  • 首页

  • 分类

  • 归档

Linux设立Swap空间

发表于 2018-09-17 | 分类于 Linux

Linux设立Swap空间

安装完Linux后再划分交换分区是可以的,下面以1G大小的文件为例:

  1. 使用dd命令在某个目录下新建一个1G的文件(以/tmp下的文件为例,但在实际使用中,不要这样,因为/tmp目录的数据在重启后丢失)
1
dd if=/dev/zero of=/tmp/swap bs=1M count=1024

bs=1M:表示单位,使用1M单位

count:是数目,与bs合起来就是1024M,1G

  1. 格式化这个文件为swap格式:
1
mkswap /tmp/swap
  1. 启动swap,用swapon命令
1
swapon /tmp/swap
  1. 查看效果
1
swapon -s
阅读全文 »

SQL优化(一)

发表于 2018-09-14 | 分类于 MySQL

SQL 优化(一)

优化SQL一般步骤

  1. 通过show status命令了解各种SQL的执行频率
  2. 定位执行效率较低的SQL语句
  3. 通过EXPLAIN分析低效SQL的执行计划
  4. 通过show profile分析SQL
  5. 通过trace分析优化器如何选择执行计划
  6. 确定问题并采取相应的优化措施

通过show status命令了解各种SQL的执行频率

1
show [session|global] status;

该命令提供服务器状态信息

  • session选项:显示当前连接的统计结果
  • global选项:显示自数据库上次启动至今的统计结果

示例:

1
show status like "Com_%";

几个重要的统计参数:

Com_xxx:每个xxx语句执行数,对于所有的存储引擎的表操作都会进行累计

  • Com_select:执行SELECT的次数
  • Com_insert:执行INSERT的次数
  • Com_update:执行UPDATE的次数
  • Com_delete:执行DELETED的次数

Com_commit:记录事务提交的次数

Com_rollback:记录事务回滚的次数

Innodb_rows_xxx:针对InnoDB存储引擎的每个xxx语句所影响的行数

  • Innodb_rows_read:SELECT返回的行数
  • Innodb_rows_inserted:INSERT插入的行数
  • Innodb_rows_updated:更新的行数
  • Innodb_rows_deleted:删除的行数

Connections: 试图连接MySQL服务器的次数

Uptime:服务器工作时间

Slow_queries:慢查询次数

定位执行效率较低的SQL语句

  • 通过慢查询日志定位执行效率较低的SQL语句,用 –log-slow-queries[=file_name]选项启动
  • 使用show processlist命令查看当前MySQL在进行的线程,

通过EXPLAIN分析低效SQL的执行计划

定位到低效的SQL语句之后,通过EXPLAIN或者DESC获取MySQL是如何执行这些语句的

1
EXPLAIN [select|update|delete sql语句]

示例结果

由图中我们可以看出其中有几列是需要我们去理解的

  • select_type:表示SELECT的类型,常见取值如下,
    • SIMPLE:简单类型,就是不使用表连接或者子查询
    • PRIMARY:主查询,就是外层的查询
    • UNION:UNION中的第二个或者后面的查询语句
    • SUBQUERY:子查询中的第一个SELECT
  • table:输出结果集的表
  • type:访问类型
All index range ref eq_ref const,system NULL

​ All:全表扫描

​ index:索引全扫描

​ range:索引范围扫描,常见于<,<=, >, >=, between等操作

​ ref:使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行,还经常出现在join操作

​ eq_ref:类似ref,区别在于使用的索引是唯一索引,简单来说就是多表连接中使用primary key或者unique index作为关联条件

​ const/system:单表中最多有一个匹配行,系统会把匹配行中的其他列作为常数处理

​ NULL:MySQL不用访问表或者索引,就得到结果

类似的type还有ref_or_null,index_merge,unique_subquery,index_subquery等

  • possible_keys:表示查询时可能使用的索引
  • key:表示实际使用的索引
  • ken_len:使用到的索引字段的长度
  • rows:扫描行的数量
  • Extra:执行情况的说明和描述

通过show profile分析SQL

MySQL从5.0.37版本开始增加了对show profiles和show profile语句的支持,通过have_profiling参数,可以看到当前MSQL是否支持profile

1
select @@have_profiling;

可以通过在Session级别(当前连接时)开启profiling:

1
select @@profiling

通过profile,我们可以清楚了解SQL执行的过程

  • 执行一个select语句当做示例
  • 通过show profiles可以看到当前SQL的Query的ID是多少
  • 执行show profile for query [QueryID] 看到执行过程中线程的每个状态和消耗时间
  • 在获取到最消耗时间的线程状态后,MySQL进一步支持选择all,cpu,block io,context switch,page faults等明细类型查看MySQL在使用什么资源上耗费了过高的时间,如 show profile cpu for query 3;

下面用个例子来说明一下:

  1. 首先执行一个语句 select * from test.tb_account;这是个查找全部的语句

查询

  1. 执行完毕后,通过show profiles语句拿到当前SQL的QueryID为3;

show profiles结果

  1. 通过show profile for query可以看到执行过程中的每个线程的状态和消耗时间

结果

(因为之前那个可视化工具用的太慢,所以换到WorkBench来了,之所以用可视化,还不是因为懒)

  1. 通过第三步获取最消耗时间的线程状态后,通过选择类型来看看MySQL在使用什么资源上耗费过高的时间

执行 show profile cpu for query 3;

cpu profile

通过trace 分析优化器如何选择执行计划

MySQL 5.6提供了对SQL的跟踪trace,通过trace文件进一步了解为什么优化器选择A计划,而不选择B计划。

使用方式:

  1. 打开trace,设置格式为JSON,设置trace最大能够使用的内存大小,避免因内存过小而不能够完整显示

打开trace,设置格式

设置最大内存

  1. 执行想做trace的SQL语句
  2. 检查INFORMATION_SCHEMA.OPTIMIZER_TRACE

检查

确定问题并采取相应优化措施

相关的优化措施会有一篇博客出,至于什么时候出,看笔者的个人努力吧23333333333333333333333

一台电脑管理多个ssh key

发表于 2018-09-01 | 分类于 随记

一台电脑管理多个ssh key

最近运维那边管理服务器,考虑到服务器的账号密码的安全性,因此考虑使用免密钥登录,使用ssh进行登录。然后麻烦就来了,因为我有一些github需要ssh,而此时我并不知道如何去管理多个ssh账号,因此略显狼狈,闲下来写写博客时,才想到整理一篇这样的文章,以备日后使用

生成ssh key

使用命令

1
ssh-keygen -t rsa -C "mail@company.com"
  • -t:指定使用rsa算法生成ssh的key
  • -C:指定账户

第一回车

在第一个回车时指定生成的文件名或者指定生成文件存放的位置,这里我指定不同的文件名就好,无需指定文件位置,例如github的就指定github_rsa就好了,如果是gitLab的就gitLab_rsa

设置ssh的代理

  1. 查看代理
1
ssh-add -l

如果提示

1
Could not open a connection to your authentication agent.

则表示系统没有代理任何key,可以添加一个ssh代理

1
exec ssh-agent bash

如果已经有了代理,使用以下代码进行删除

1
ssh-add -D

添加私钥

1
2
ssh-add /c/Users/PC/.ssh/github_rsa
ssh-add /c/Users/PC/.ssh/ubuntu_rsa

添加公钥

在github上添加对应的公钥,在服务器添加对应的公钥

新建编辑一个config文件

在.ssh目录下新建一个config文件

1
touch /c/Users/PC/.ssh/config

然后往config文件里添加以下内容

1
2
3
4
5
6
7
8
9
10
11
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile /c/Users/PC/.ssh/github_rsa
user git

Host <你的服务器ip>
HostName <你的服务器ip>
PreferredAuthentications publickey
IdentityFile /c/Users/PC/.ssh/ubuntu_rsa
user ubuntu

上面是我的config文件里配置,其内容根据具体情况而定,保存之后,通过ssh -T git@github.com进行测试

MySQL主从复制

发表于 2018-09-01 | 分类于 MySQL

MySQL主从复制

参考文章:mysql主从复制

做完项目之后,翻翻以前的博客,发觉之前配置了SpringBoot动态选择数据源,然后仔细想想当时MySQL的主从复制并没有弄出来,今儿就来弄一下MySQL的主从复制,加上之前的动态选择数据源,真正向读写分离进一步靠近。同时也向分布式一步一步靠近。

由于使用了Docker配置,因此我将在Docker上进行MySQL的主从复制的配置。当然实际生产环境中,MySQL的主从复制应该是由两台机进行的,原因是当单机的MySQL已经无法承载其用户体量的时候,应考虑进行读写分离。而在Docker配置两个MySQL纯属练习。目的是掌握核心配置步骤。(讲真,还是因为Docker比较方便)当然,本文还是会讲下如何不使用Docker进行主从配置,其实道理都是一样的。

阅读全文 »

MySQL5.7 JSON新特性

发表于 2018-08-29 | 分类于 MySQL

MySQL5.7 JSON新特性

项目实践

背景

在一次项目中,有一个这样的需求,就是可以编辑一个报名表单结构,同时能够保存用户的报名表单数据,并且根据条件进行搜索。由于表单结构可变,并且搜索项根据表单结构查询,因此这块使用了MySQL5.7新特性json函数。因为一开始考虑到这个问题,原想着用MonoDB去实现,但觉得觉得在项目初步阶段,为了这样一个小需求,使用一个NoSQL数据库,仅保存这一点东西,不太合理,恰巧有伙伴了解到MySQL在5.7版本支持了json的存储,因此把数据库升级到MySQL5.7.x使用JSON这个新特性。不得不说MySQL大有一统数据库的野心,一个关系型数据库,居然支持json形式存储。

阅读全文 »

SpringBoot Quartz 定时任务

发表于 2018-08-29 | 分类于 springboot

SpringBoot Quartz 定时任务

简介

Quartz是一个完全由Java编写的开源作业调度框架。项目由于需要使用定时任务,考虑到其与Spring里面的SpringTask在cron表达式的一个区别,所以选择了Quartz(具体什么区别末尾会提及)。不得不说,Quartz在定时任务这块操作起来简易得让人发指。起一个定时任务超级简单。

  • 创建实现org.quartz.Job接口的java类,其中只有一个方法:execute (JobExecutionContext context) throws JobExecutionException,将要实现的任务逻辑添加进execute这个方法里
  • 创建JobDetail
  • 创建触发器(CronTrigger)
  • Scheduler开启定时任务
阅读全文 »

springboot动态选择多数据源

发表于 2018-06-12 | 分类于 springboot

springboot动态选择数据源

前情回顾:

  • springboot配置多数据源

前面介绍了springboot如何配置多数据源,最近又捣鼓了一下怎么去动态选择数据源,这里先提醒一下,动态选择数据源不等于主从复制,也不等于读写分离,这三的概念必须先理清楚,动态选择数据源是读写分离的基础,而主从复制是读写分离的依据。读写分离可以减少数据访问时的压力,并提高性能,同时也是作为负载均衡的一个重要基础

阅读全文 »

springboot配置多数据源

发表于 2018-06-09 | 分类于 springboot

springboot配置多数据源

概述

考虑到当项目发展壮大的时候,项目在数据库层面会遭遇瓶颈,因此想起了多数据源配置,并且实现主从数据库分离。下文将演示如何使用springboot进行多数据源配置。

项目框架

  • SpringBoot
  • Spring Data JPA
  • MySQL

基本操作

阅读全文 »

SpringBoot + Maven多模块配置

发表于 2018-06-07 | 分类于 springboot

最近准备跟伙伴合作开发一个OA系统,环境使用SpringBoot + maven,由于在此之前我们都是单兵作战,所以在项目开始前,打算率先解决这个问题。使用SpringBoot + Maven进行多模块配置

开始前,先了解一下maven的几个知识点。

  • groupId:定义当前 Maven 项目隶属的实际项目,一个实际项目下会有多个 Maven 项目。如一家公司开发的产品,groupId 就是公司/个人域名,但会包括众多的 Maven 项目;
  • artifactId:定义实际项目中的一个 Maven 项目,一般用实际项目名称作为 artifactId 的前缀;
  • versioin:指定工程的版本,如 - 1.0 SNAPSHOT,SNAPSHOT 意为快照,说明在该项目还处于开发中;
  • packaging:定义 Maven 项目的打包方式,有 JAR 、WAR 和 EAR 三种格式详情见:JAR,WAR,EAR区别
  • dependencies:所有依赖在此范围添加,包含众多dependency
  • parent:指定当前项目的父模块或者父工程,使用groupId,artifactId定位项目
  • modules:在父模块中引用子模块,所有子模块均包含在里面
  • module:表示一个子模块,使用相对路径
阅读全文 »

HTML&CSS基础

发表于 2018-05-31 | 分类于 前端基础

[TOC]

相对路径

相对路径就是相对于当前HTML页面所在的位置

1
<img src="abc/cba/2.gif"/>

上述代码中src属性配置的是图片的格式,使用相对路径。如果当前页面所在的文件夹里有abc文件夹,将进入abc文件夹,同时进入abc里的cba文件夹找到2.gif。==可以使用../来返回上一级目录,返回几级目录就写几个../==

图片格式

JPEG(JPG), GIF, PNG都是图片格式

  • JPEG格式:支持颜色比较多,图片可以压缩,但是不支持透明,一般使用JPEG保存照片等颜色丰富的图片
  • GIF格式:支持颜色少,只支持简单的透明(直线型透明),支持动态图,一般使用图片颜色单一或者动态图。
  • PNG格式:支持颜色多,支持复杂透明,一般用于显示颜色复杂的透明图片

==图片使用原则:==

  • 效果不一致,使用效果好的
  • 效果一致,使用小的

meta标签

代表网页元数据,给搜索引擎看的,搜索引擎在检索页面时,会同时检索页面中的关键字和描述。

  • 使用meta标签设置网页关键字
1
<meta name="keywords" content="HTML5" />

HTML5是关键字,也就是说content里面是关键字,name的值是对content的描述。content里可以使用多个关键字,如content=“HTML5,Java,Python”

  • 使用meta标签指定网页的描述
1
<meta name="decription" content="666666博文"/>

666666博文是描述

  • 使用meta标签用来做请求重定向
1
<meta http-equiv="refresh" content="5; url=http://www.baidu.com"/>

http-equiv是http协议,然后content里面5表示秒数,等待的时间;url表示目标路径,整个表示5秒以后去到http://www.baidu.com这个地址。

阅读全文 »
1234

Stuartd

不定时更新一些技术上的坑或者吐槽之类的

34 日志
11 分类
© 2019 Stuartd
|
主题 — NexT.Gemini v5.1.4
本站总访问量次