Java程序猿搬砖笔记(十八)

MySQL索引命名规范、索引使用规范

索引命名规范:

  • 索引名必须全部使用小写。
  • 非唯一索引按照“idx_字段名称[_字段名称]”进用行命名。例如idx_age_name。
  • 唯一索引按照“uniq_字段名称[_字段名称]”进用行命名。例如uniq_age_name。
  • 组合索引建议包含所有字段名,过长的字段名可以采用缩写形式。例如idx_age_name_add。

索引使用规范:

  • 单张表中索引数量不超过5个。
  • 单个索引中的字段数不超过5个。
  • 表必须有主键,推荐使用UNSIGNED自增列作为主键。
  • 唯一键由3个以下字段组成,并且字段都是(整)(形)(时),可使用唯一键作为主键。其他情况下,建议使用自增列或发号器作主键。
  • 联表查询时,JOIN列的数据类型必须相同,关联字段要建立索引。
  • 不在低基数列上建立索引,例如“性别”。
  • 选择区分度大的列建立索引。组合索引中,区分度大的字段放在最前。
  • 对字符串使用前缀索引,前缀索引长度不超过8个字符。
  • 不对过长的VARCHAR字段建立索引。建议优先考虑前缀索引,或添加CRC32或MD5伪列并建立索引。
  • 合理创建联合索引,(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c)。
  • 合理使用覆盖索引减少磁盘IO,避免文件系统排序。
  • 禁止冗余索引。
  • 禁止重复索引。
  • 禁止使用外键。

参考链接

SpringBoot使用@Lazy解决循环依赖问题

@Lazy注解可以用于延迟初始化Bean,从而避免循环依赖。当一个Bean被标记为@Lazy时,它将在第一次使用时才被初始化。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
@Component
public class A {
@Autowired
@Lazy
private B b;
}

@Component
public class B {
@Autowired
private A a;
}

SpringBoot循环依赖的6种解决方案

参考链接

Nginx超时时间设置

1、send_timeout?
发送数据至客户端超时, 默认60s, 如果连续的60s内客户端没有收到1个字节, 连接关闭
2、proxy_connect_timeout
Nginx与upstream server的连接超时时间
3、proxy_read_timeout
Nginx接收upstream server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭
4、proxy_send_timeout
Nginx发送数据至upstream server超时, 默认60s, 如果连续的60s内没有发送1个字节, 连接关闭

在这里插入图片描述

这几个配置放在location、server、http都可以,Nginx会取最小值。
windows环境超时时间配置无效,原因未知

参考链接参考链接

Linux统计当前文件夹下的文件个数、目录个数

1
2
3
4
5
6
7
8
// 统计当前文件夹下文件的个数,不包括子文件夹里的
ls -l |grep "^-"|wc -l
// 统计当前文件夹下文件的个数,包括子文件夹里的
ls -lR|grep "^-"|wc -l
// 统计当前文件夹下目录(子文件夹)的个数,不包括子文件夹里的
ls -l |grep "^d"|wc -l
// 统计文件夹下目录(子文件夹)的个数,包括子文件夹里的
ls -lR|grep "^d"|wc -l

说明:
ls -l :
长列表输出当前文件夹下文件信息(注意这里的文件,不同于一般的文件,可能是目录、链接、设备文件等);
grep “^-” :
这里将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d
wc -l :
统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于一行信息对应一个文件,所以也就是文件的个数。

Linux查看内存使用情况命令

1、free -h
2、cat /proc/meminfo
3、top

参考链接

Git更换远程仓库地址

参考链接

TPS、QPS、RT、吞吐量、最佳线程数量的理解

性能指标:QPS、TPS、系统吞吐量理解两分钟读懂什么是TPS和QPS

MySQL多表联合更新

示例:

1
2
3
update jx_org_sequence_grade g, sys_org_tbl o
set g.org_id = o.id
where g.org_name = o.name;

参考链接

Spring和mybatis中@Param注解的区别

参考链接

Spring jedis集群配置

配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
# reids配置
spring.redis:
prefix: cxhl-dev
cluster:
nodes: 10.12.12.222:6379,10.12.12.222:6380,10.12.12.222:6381 #集群节点
password: ENC(BTYyu7j+9vA+v+0lEL388NGzQvU1J8I/) #密码
username: default
jedis:
pool:
max-active: 10 #连接池最大连接数
max-idle: 8 #连接池中最大空闲连接数
min-idle: 0 #连接池中最小空闲数
timeout: 5000 #访问超时时间

配置类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
* Redis缓存配置类
*
*/
@Configuration
@EnableCaching
@Slf4j
public class RedisConfig extends CachingConfigurerSupport {

@Value("${spring.redis.cluster.nodes}")
private Set<String> nodeSet;

@Value("${spring.redis.password}")
private String password;

@Value("${spring.redis.timeout}")
private int timeout;

@Value("${spring.redis.jedis.pool.max-active}")
private int maxActive;

@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;

@Value("${spring.redis.jedis.pool.min-idle}")
private int minIdle;

@Bean
public JedisCluster redisCluster() {

// 设置redis集群的节点信息
Set<HostAndPort> nodes =nodeSet.stream().map(node -> {
String[] nodeInfo = node.split(":");
if (nodeInfo.length == 2) {
return new HostAndPort(nodeInfo[0], Integer.parseInt(nodeInfo[1]));
} else {
return new HostAndPort(nodeInfo[0], 6379);
}
}).collect(Collectors.toSet());

// 配置连接池
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(maxActive);
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMinIdle(minIdle);

// 创建jediscluster,传入节点列表和连接池配置
JedisCluster cluster = new JedisCluster(nodes,timeout,timeout,3, password,jedisPoolConfig);
log.info("RedisConfig 集群信息:{}",cluster);
return cluster;
}
}

MySQL存储过程学习

游标

  • 局部变量定义要在游标之前
1
2
3
declare uname varchar(100);
declare upro varchar(100);
declare u_cursor cursor for select name,profession from tb_user where age <= uage;
  • 把游标中获取到的值赋值给变量
1
fetch u_cursor into uname,upro;

条件处理程序

语法:
在这里插入图片描述

示例:

1
2
-- 声明条件处理程序 : 当SQL语句执行抛出的状态码为02000时,将关闭游标u_cursor,并退出
declare exit handler for SQLSTATE '02000' close u_cursor;

MySQL存储函数和存储过程的区别

  • 存储函数的输入参数只能是in
  • 存储函数必须有返回值,所以使用很少
  • 存储函数能做的,存储过程都可以做

参考:黑马程序的MySQL-进阶篇.pdf

MySQL查询数据库表的所有字段并用逗号分隔

1
2
3
4
-- 按ordinal_position 字段排序
select group_concat(column_name order by ordinal_position asc)
from information_schema.columns
where table_schema ='数据库' and table_name = '表名';

group_concat函数语法:
group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )
默认就是’,'号分割。

Mybatis查询数据为null时,返回情况总结

  • 返回类型为集合类型,返回一个空集合(大小为0,非null),避免空指针异常
  • 返回类型为基本类型(int、long),会抛空指针异常。
  • -返回类型为基本类型的包装类型(Integer、Long),返回null