Skip to content

Commit 1ee7240

Browse files
committed
add post
1 parent c9dacaf commit 1ee7240

File tree

2 files changed

+239
-0
lines changed

2 files changed

+239
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
title: MySql中InnoDB表为什么要建议用自增列做主键
2+
tags:
3+
- Mysql
4+
categories:
5+
- Dev
6+
- DataBase
7+
date: 2020-04-10 13:55:00
8+
cover: true
9+
---
10+
11+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/mysql.png)
12+
<!-- more -->
13+
14+
## InnoDB引擎表的特点
15+
### 1、InnoDB引擎表是基于B+树的索引组织表(IOT)
16+
关于B+树
17+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/mysql-1.png)
18+
19+
20+
B+ 树的特点:
21+
* 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
22+
* 不可能在非叶子结点命中;
23+
* 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
24+
25+
### 2、主键(PRIMARY KEY)
26+
如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引、如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。
27+
28+
### 3、主索引
29+
数据记录本身被存于主索引(一颗B+Tree)的叶子节点上。这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)
30+
31+
### 4、自增主键
32+
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页
33+
34+
### 5、非自增主键
35+
如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。
36+
37+
### 总结
38+
如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的,也就是下面这几种情况的存取效率最高:
39+
1、使用自增列(INT/BIGINT类型)做主键,这时候写入顺序是自增的,和B+数叶子节点分裂顺序一致;
40+
41+
2、该表不指定自增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这时候InnoDB会选择内置的ROWID作为主键,写入顺序和ROWID增长顺序一致;
42+
除此以外,如果一个InnoDB表又没有显示主键,又有可以被选择为主键的唯一索引,但该唯一索引可能不是递增关系时(例如字符串、UUID、多字段联合唯一索引的情况),该表的存取效率就会比较差。
43+
44+
《高性能MySQL》中的原话
45+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/mysql-2.png)
46+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/mysql-3.png)
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
title: Nginx实现负载均衡
2+
author: 少年闰土
3+
tags:
4+
- Nginx
5+
categories:
6+
- Dev
7+
- Tools
8+
date: 2020-04-11 13:47:00
9+
cover: true
10+
---
11+
12+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/nginx.png)
13+
<!-- more -->
14+
15+
负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中。
16+
17+
负载均衡的优势在访问量少或并发小的时候可能并不明显,且不说淘宝双11、铁道部抢票这种级别的访问量、高并发,就是一般网站的抢购活动时,也会给服务器造成很大压力,可能会造成服务器崩溃。而负载均衡可以很明显的减少甚至消除这种情况的出现,下面我们说说实现方法。
18+
19+
准备工作
20+
21+
首先下载安装Nginx。
22+
23+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/nginx-1.png)
24+
25+
下载完成解压到本地盘符。解压后是这样的
26+
27+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/nginx-2.png)
28+
29+
注意:nginx.exe是启动的程序,为了方便我们可以手写两个bat文件:
30+
31+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/nginx-3.png)
32+
33+
我将nginx解压到了我本地的E盘
34+
35+
reload.bat
36+
37+
```
38+
E:
39+
cd kit\nginx-1.14.0\
40+
nginx -s reload
41+
```
42+
43+
stop.bat
44+
45+
```
46+
E:
47+
cd kit\nginx-1.14.0\
48+
nginx -s stop
49+
```
50+
51+
我们双击nginx.exe就可以启动nginx,我们启动一下,打开任务 管理器看到
52+
53+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/nginx-4.png)
54+
55+
就说明启动成功。
56+
57+
接下来配置两个tomcat来进行测试,下面是我本地的tomcat,存放在E盘中。
58+
59+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/nginx-5.png)
60+
61+
拷贝一份放到我的D盘中,并修改端口号,默认 为8080,我们将D盘中的tomcat端口号修改为8082,将E盘中的tomcat端口号修改为8081。
62+
63+
端口号的修改:
64+
65+
找到conf
66+
67+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/nginx-6.png)
68+
69+
修改
70+
71+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/nginx-7.png)
72+
73+
修改如下:
74+
75+
```
76+
<Server port="8006" shutdown="SHUTDOWN">
77+
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
78+
<Listener className="org.apache.catalina.core.JasperListener" />
79+
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
80+
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
81+
<GlobalNamingResources>
82+
<Resource name="UserDatabase"
83+
auth="Container"
84+
type="org.apache.catalina.UserDatabase"
85+
description="User database that can be updated and saved"
86+
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
87+
pathname="conf/tomcat-users.xml" />
88+
</GlobalNamingResources>
89+
<Service name="Catalina">
90+
<Connector port="8082"
91+
protocol="HTTP/1.1"
92+
connectionTimeout="20000"
93+
redirectPort="8443" />
94+
<Connector port="8010"
95+
protocol="AJP/1.3"
96+
redirectPort="8443" />
97+
<Engine name="Catalina" defaultHost="localhost">
98+
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
99+
resourceName="UserDatabase"/>
100+
<Host name="localhost"
101+
appBase="webapps"
102+
unpackWARs="true"
103+
autoDeploy="true"
104+
xmlValidation="false"
105+
xmlNamespaceAware="false">
106+
</Host>
107+
</Engine>
108+
</Service>
109+
</Server>
110+
```
111+
112+
将E盘中的tomcat端口号修改为8081;只需修改默认文件中的一点
113+
114+
```
115+
<Connector port="8081"
116+
protocol="HTTP/1.1"
117+
connectionTimeout="20000"
118+
redirectPort="8443" />
119+
```
120+
121+
配置nginx的配置文件:
122+
123+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/nginx-8.png)
124+
125+
找到文件中的server节点,然后再上面添加
126+
127+
```
128+
upstream local_tomcat_test {
129+
server localhost:8082 weight=8 max_fails=3 fail_timeout=30s;
130+
server localhost:8081 weight=2 max_fails=3 fail_timeout=30s;
131+
}
132+
```
133+
134+
然后修改server:
135+
136+
```
137+
upstream local_tomcat_test {
138+
server localhost:8082 weight=8 max_fails=3 fail_timeout=30s;
139+
server localhost:8081 weight=2 max_fails=3 fail_timeout=30s;
140+
}
141+
server {
142+
listen 80;
143+
server_name localhost;
144+
location / {
145+
proxy_pass http://local_tomcat_test;
146+
#root html;
147+
#index index.html index.htm
148+
}
149+
```
150+
151+
配置完成后,启动两个tomcat,为了区分是哪个tomcat,我把tomcat的默认访问页进行了修改。
152+
153+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/nginx-9.png)
154+
155+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/nginx-10.png)
156+
157+
然后我们再地址栏输入localhost,试试效果:
158+
159+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/nginx-11.png)
160+
161+
访问了tomcat-8082,刷新一下:
162+
163+
![](https://cdn.jsdelivr.net/gh/coder-lida/CDN/img/assert/nginx-12.png)
164+
165+
可以看到访问了tomcat-8081
166+
167+
各参数的含义:
168+
169+
```
170+
worker_processes:工作进程个数,可配置多个
171+
worker_connections:单个进程最大连接数
172+
server:每一个server相当于一个代理服务器
173+
lister:监听端口,默认80
174+
server_name:当前服务的域名,可以有多个,用空格分隔(我们是本地所以是localhost)
175+
location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
176+
index:当没有指定主页时,默认会选择这个指定的文件,可多个,空格分隔
177+
proxy_pass:请求转向自定义的服务器列表
178+
upstream name{ }:服务器集群名称
179+
```
180+
181+
小结
182+
183+
nginx作为一个反向代理服务器,能缓存我们项目的静态文件,并实现反向代理与均衡负载,可以有效减少服务器压力,即使项目不大,也可以使用。
184+
185+
大家另外应该都还发现了个问题,虽然这样请求能分别请求到两个tomcat上,如果是一般不需身份校检的或什么认证的方法尚可,但如果出现这类情况:
186+
187+
我们在tomcat1上进行了登录,这时用户session当然是存在tomcat1上的,而这时进入个人中心的请求请求到tomcat2上了,这时就会出现问题了。tomcat2会告诉你还未登录,这显然不是我们想看到的。
188+
189+
这就涉及到session共享了,如何让两个服务器上的session共用。我这里放到下次再说,可能要过个好几天。
190+
191+
感谢大家支持。
192+
193+

0 commit comments

Comments
 (0)