Skip to content

Commit 6478632

Browse files
committed
perf: 部分文章内容优化
1 parent aaaadf9 commit 6478632

5 files changed

+101
-102
lines changed

database/我说MySQL每张表最好不超过2000万数据,面试官让我回去等通知?.md

+9-10
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
# 前言
4242

43-
一般来说,MySQL每张表最好不要超过2000万条数据,否则就会导致性能下降。阿里的Java开发手册上也提出:单表行数超过 500 万行或者单表容量超过 2GB,**才推荐**进行分库分表。
43+
很多人说,MySQL每张表最好不要超过2000万条数据,否则就会导致性能下降。阿里的Java开发手册上也提出:单表行数超过 500 万行或者单表容量超过 2GB,**才推荐**进行分库分表。
4444

4545
但实际上,这个2000万或者500万都只是一个大概的数字,并不适用于所有场景,如果盲目的以为表数据只要不超过2000万条就没问题了,很可能会导致系统的性能大幅下降。
4646

@@ -52,15 +52,15 @@
5252

5353
阅读本文你需要有一定的MySQL基础,最好对InnoDB和B+树都有一定的了解,可能需要有一年以上的MySQL学习经验(大概一年?),知道 “InnoDB中B+树的高度一般保持在三层以内会比较好” 这条理论知识。
5454

55-
本文主要是针对 “InnoDB中高度为3的B+树最多可以存多少数据” 这一话题进行讲解的。且本文对数据的计算比较严格(至少比网上95%以上的相关博文都要严格),如果你比较在意这些细节并且目前不太清楚的话,请继续往下阅读。
55+
**本文主要是针对 “InnoDB中高度为3的B+树最多可以存多少数据” 这一话题进行讲解的**。且本文对数据的计算比较严格(至少比网上95%以上的相关博文都要严格),如果你比较在意这些细节并且目前不太清楚的话,请继续往下阅读。
5656

5757
阅读本文你大概需要花费10-20分钟的时间,如果你在阅读的过程中对数据进行验算的话,可能要花费30分钟左右。
5858

5959
---
6060

6161
# 本文思维导图
6262

63-
![InnoDB三层B+数的存储计算-思维导图](image/InnoDB%E4%B8%89%E5%B1%82B+%E6%95%B0%E7%9A%84%E5%AD%98%E5%82%A8%E8%AE%A1%E7%AE%97-%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE.png)
63+
![InnoDB三层B+数的存储计算-思维导图](http://cdn.image.sticki.cn/202402221151954.png)
6464

6565
---
6666

@@ -98,7 +98,7 @@
9898
> - **如果行超过最大行长度, 则将可变长度列用外部页存储,直到该行符合最大行长度限制。**
9999
> 就是说把varchar、text这种长度可变的存到外部页中,来减小这一行的数据长度。
100100
>
101-
> ![image-20221108112456250](image/image-20221108112456250.png)
101+
> ![](http://cdn.image.sticki.cn/202402221151956.png)
102102
>
103103
> 文档地址:[MySQL :: MySQL 5.7 Reference Manual :: 14.12.2 File Space Management](https://dev.mysql.com/doc/refman/5.7/en/innodb-file-space.html)
104104
@@ -135,7 +135,7 @@
135135

136136
示意图:
137137

138-
![image-20221114001945501](image/image-20221114001945501.png)
138+
![](http://cdn.image.sticki.cn/202402221151957.png)
139139

140140
> 页格式这块的内容,我在官网翻了好久,硬是没找到🤧。。。。不知道是没写还是我眼瞎,有找到的朋友希望可以在评论区帮我挂出来😋。
141141
>
@@ -157,7 +157,7 @@
157157

158158
> 官方文档链接:[MySQL :: MySQL 5.7 参考手册 :: 14.11 InnoDB 行格式](https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html#innodb-compact-row-format-characteristics)(包括下面的行格式内容大都可以在里面找到)
159159
>
160-
> ![image-20221109115728845](image/image-20221109115728845.png)
160+
> ![](http://cdn.image.sticki.cn/202402221151958.png)
161161
162162
---
163163

@@ -173,7 +173,7 @@
173173

174174
示意图:
175175

176-
![image-20221114002337062](image/image-20221114002337062.png)
176+
![](http://cdn.image.sticki.cn/202402221151959.png)
177177

178178
另外还有几点需要注意:
179179

@@ -231,9 +231,8 @@ varchar、text等类型会有长度字段列表来记录他们所占用的长度
231231

232232
每一条索引记录当中都包含了**当前索引的值****一个 6字节 的指针信息****一个 5 字节的行标头**,用来指向下一层数据页的指针。
233233

234-
> 索引记录当中的指针占用空间我没在官方文档里找到😭,这个 6 字节是我参考其他博文的,他们说源码里写的是6字节,但具体在哪一段源码我也不知道😭
234+
> 索引记录当中的指针占用空间我没在官方文档里找到,这个 6 字节是我参考其他博文的,他们说源码里写的是6字节,这点我并未求证
235235
>
236-
> 希望知道的同学可以在评论区解惑。
237236
238237
假设我们的主键id为 bigint 型,也就是8个字节,那索引页中每行数据占用的空间就等于 $8 + 6 + 5 = 19$ 字节。每页可以存 $15232 \div 19 \approx 801$ 条索引数据。
239238

@@ -347,7 +346,7 @@ CREATE TABLE `blog` (
347346
>\
348347
>前端 Vue2 + ElementUI + Axios
349348
350-
==目前项目还有很大改进和完善的空间,欢迎各位有意愿的同学参与项目贡献==(目前特缺前端),一起学习一起进步😋。
349+
目前项目还有很大改进和完善的空间,欢迎各位有意愿的同学参与项目贡献(目前特缺前端),一起学习一起进步😋。
351350

352351

353352

java/基于javax.validation自定义参数校验注解,类似@NotNull.md

+18-18
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66

77
标题图:
88

9-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706626699303-207e877a-0c56-4568-9df4-6cd27df96670.png)
9+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706626699303-207e877a-0c56-4568-9df4-6cd27df96670.png)
1010

11-
![img](https://cdn.nlark.com/yuque/0/2024/jpeg/29587979/1706413828444-4b81108b-e3c1-47a5-8fe8-c8c3fd19f175.jpeg)
11+
![](https://cdn.nlark.com/yuque/0/2024/jpeg/29587979/1706413828444-4b81108b-e3c1-47a5-8fe8-c8c3fd19f175.jpeg)
1212

1313
----
1414

@@ -66,13 +66,13 @@ public class UserRegisterParamVo {
6666

6767
包内还提供了很多其他类型的校验注解:
6868

69-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705051761792-a697d06c-6059-4f10-8c07-92cdb9f5e876.png)
69+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705051761792-a697d06c-6059-4f10-8c07-92cdb9f5e876.png)
7070

7171
相信大家对这块也不陌生了,我就不过多介绍了,下面主要是想跟大家分享如何根据自己的需求来自定义一个这样的注解。
7272

7373
当然我知道可以通过很多其他的方式来解决参数校验的问题,但我觉得用注解的方式确实很舒服。
7474

75-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705052427491-e1beeb3d-18bb-414e-9c9b-2ccf46ac4536.png)
75+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705052427491-e1beeb3d-18bb-414e-9c9b-2ccf46ac4536.png)
7676

7777
# 2. 为什么需要自定义
7878

@@ -92,17 +92,17 @@ javax.validation 提供了扩展的方法,用户完全可以自定义一个和
9292

9393
我们先来观察一下 NotNull 这个注解的源码:
9494

95-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705053153160-e0e1b501-240f-497f-a892-195458b60c0b.png)
95+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705053153160-e0e1b501-240f-497f-a892-195458b60c0b.png)
9696

9797
注意到`@Constraint(validatedBy = { })`这个注解了吗?Constant这个单词的意思是“约束”,validatedBy的意思是“通过....验证”,很明显它和参数校验沾点关系。
9898

9999
我们来看下 @Constraint 的描述信息:
100100

101-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705053172105-48e4802a-ac83-476f-83b1-5dd6d85585b6.png)
101+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705053172105-48e4802a-ac83-476f-83b1-5dd6d85585b6.png)
102102

103103
一堆英文,没好好学英语的同学肯定看不懂吧?
104104

105-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705065662943-fea3448e-b9db-4dba-b71e-1554457f5e42.png)
105+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705065662943-fea3448e-b9db-4dba-b71e-1554457f5e42.png)
106106

107107
我也看不懂😅。
108108

@@ -120,15 +120,15 @@ javax.validation 提供了扩展的方法,用户完全可以自定义一个和
120120

121121
注意这里又出现新目标了,来看看这个 ConstraintValidator 是什么:
122122

123-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705057573502-5bcfeaf2-dc38-4fe6-8ff5-a9dd35f7a20c.png)
123+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705057573502-5bcfeaf2-dc38-4fe6-8ff5-a9dd35f7a20c.png)
124124

125125
大概意思是说,这个接口是用来定义约束注解的具体约束逻辑的,它的泛型参数为 <A extends Annotation, T>,其中 A 表示这个验证器将要用来验证的注解类,T 表示这个验证器支持验证哪些类型。
126126

127127
然后 initialize 用来初始化验证器,其实是提供给你获取注解参数的。
128128

129129
核心方法是 isValid ,它是用来实现具体验证逻辑的,其中参数 value 就是被验证的那个对象的值,验证通过就返回 true,失败就返回 false,还是很容易理解的。
130130

131-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705065746697-aca51789-2763-48dc-a4a5-7dc0164b75f2.png)
131+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705065746697-aca51789-2763-48dc-a4a5-7dc0164b75f2.png)
132132

133133
好,那么好,看到这一步,其实已经基本明确了我们该如何自定义一个约束注解类。
134134

@@ -144,7 +144,7 @@ javax.validation 提供了扩展的方法,用户完全可以自定义一个和
144144

145145
这下看懂了吧,如果还没看懂,那只能说明我的表达有问题,不用客气,在评论区吐槽就完事了。
146146

147-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705065713441-0405739a-0105-4246-86a5-ef897c5e8189.png)
147+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705065713441-0405739a-0105-4246-86a5-ef897c5e8189.png)
148148

149149
# 4. 如何实现
150150

@@ -221,7 +221,7 @@ public boolean isValid(List<String> value, ConstraintValidatorContext context) {
221221

222222
最后还有一步,可千万不能忘了需要用 validatedBy 来指定约束注解的验证器。我们回到 NotBlankFields ,把参数补上:
223223

224-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705368979430-bc902bba-d42e-4d26-af4c-800cfe7e7252.png)
224+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1705368979430-bc902bba-d42e-4d26-af4c-800cfe7e7252.png)
225225

226226
> 这里的代码我提交到了GitHub上,有需要查看源码的朋友可以查看:https://github.com/stick-i/scblogs/pull/204
227227
@@ -264,23 +264,23 @@ public class TestParamVo {
264264

265265
参数值为null的情况下,校验不通过:
266266

267-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706623980456-09a9edc6-9c96-4b8b-aabe-be1d6ebc5e7a.png)
267+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706623980456-09a9edc6-9c96-4b8b-aabe-be1d6ebc5e7a.png)
268268

269269
参数值为空数组的情况下,校验不通过:
270270

271-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706623998004-48f6babf-1c24-4d06-a5b6-e6017ebb8efe.png)
271+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706623998004-48f6babf-1c24-4d06-a5b6-e6017ebb8efe.png)
272272

273273
参数值为三个空字符串组成的非空列表,校验不通过:
274274

275-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706624087008-c1f4051e-376d-4071-a216-293ebbff96b5.png)
275+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706624087008-c1f4051e-376d-4071-a216-293ebbff96b5.png)
276276

277277
参数值中部分字符串为空字符串的情况,校验不通过:
278278

279-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706624148503-fe236681-4aa4-45f5-b4df-a3255be40f53.png)
279+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706624148503-fe236681-4aa4-45f5-b4df-a3255be40f53.png)
280280

281281
参数正常的情况下,校验通过:
282282

283-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706626074396-cad3b6ae-2fef-4a38-8c0f-0457f6d15814.png)
283+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706626074396-cad3b6ae-2fef-4a38-8c0f-0457f6d15814.png)
284284

285285
所有测试用例都通过了,这样的话,就已经满足我们前面所提出的条件了、
286286

@@ -395,8 +395,8 @@ public boolean isValid(List<String> value, ConstraintValidatorContext context) {
395395

396396
希望你学会了之后,明天就去公司写一个,写完之后给同事亮一手!
397397

398-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706626699303-207e877a-0c56-4568-9df4-6cd27df96670.png)
398+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706626699303-207e877a-0c56-4568-9df4-6cd27df96670.png)
399399

400400
看在作者这么认真的份上,建议关注趁早关注下,等我以后火了,在坐的各位就都是老粉了!
401401

402-
![img](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706436823990-4378f9cf-5935-4d68-b6e4-a5789f250129.png)
402+
![](https://cdn.nlark.com/yuque/0/2024/png/29587979/1706436823990-4378f9cf-5935-4d68-b6e4-a5789f250129.png)

other/GitHub连接不稳定解决方案.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
1717
那有聪明的朋友就要说了:“我有梯子我不怕,访问速度快得很”,那没有梯子的朋友该怎么办呢?
1818

19-
==如果你也有这些烦恼,那很高兴你能看到这篇文章,因为它或许能够帮你解决这些问题,至少让你能基本使用GitHub🧐。==
19+
**如果你也有这些烦恼,那很高兴你能看到这篇文章,因为它或许能够帮你解决这些问题,至少让你能基本使用GitHub🧐。**
2020

2121

2222

@@ -31,7 +31,7 @@
3131

3232
# 一、操作远程仓库解决方案
3333

34-
大多数同学可能是使用的http协议创建的远程连接,就是当我们创建远程仓库的时候,使用的是下图里HTTPS的链接,==但其实很多人不知道,用SSH协议操作GitHub仓库其实是很流畅的==
34+
大多数同学可能是使用的http协议创建的远程连接,就是当我们创建远程仓库的时候,使用的是下图里HTTPS的链接,**但其实很多人不知道,用SSH协议操作GitHub仓库其实是很流畅的**
3535

3636
![image-20221024201617015](image/image-20221024201617015.png)
3737

@@ -200,5 +200,5 @@ FastGitHub是一个免费的、开源的、仅用于加速GitHub的工具,作
200200
>\
201201
>前端 Vue2 + ElementUI + Axios
202202
203-
==目前项目还有很大改进和完善的空间,欢迎各位有意愿的同学参与项目贡献==(尤其前端),一起学习一起进步😋。
203+
**目前项目还有很大改进和完善的空间,欢迎各位有意愿的同学参与项目贡献**(尤其前端),一起学习一起进步😋。
204204

0 commit comments

Comments
 (0)