[译]B-Tree叶节点格式
我们将表的格式从未排序的行数组更改为 B 树。这是一个很大的更改,需要多篇文章来实现。在本文的结尾,我们将定义叶节点的布局,并支持将键/值对插入到单节点树中。但首先,让我们回顾一下切换到树结构的原因。
替代表格格式
使用当前格式,每个页面仅存储行(无元数据),因此非常节省空间。插入也很快速,因为我们只需追加到末尾即可。但是,只能通过扫描整个表来查找特定行。如果要删除一行,则必须通过移动其后的每一行来填补该空缺。
如果我们将表存储为数组,但按 id 对行进行排序,则可以使用二分查找来查找特定 id。但是,插入会很慢,因为我们必须移动很多行来腾出空间。
相反,我们使用树结构。树中的每个节点可以包含数量可变的行,因此我们必须在每个节点中存储一些信息来跟踪它包含多少行。此外,所有不存储任何行的内部节点还存在存储开销。作为对更大的数据库文件进行交换,我们获得了快速的插入、删除和查找。
未排序的行数组 | 已排序的行数组 | 节点树 | |
---|---|---|---|
页面包含 | 仅数据 | 仅数据 | 元数据、主键和数据 |
每页行数 | 更多的 | 更多的 | 更少 |
插入 | O(1) | O(n) | O(log(n)) |
删除 | O(n) | O(n) | O(log(n)) |
通过id查找 | O(n) | O(log(n)) | O(log(n)) |
[译]B-Tree
B-Tree是 SQLite 用来表示表和索引的数据结构,因此它是一个非常核心的思想。本文只是介绍数据结构,所以不会有任何代码。
为什么树是数据库的良好数据结构?
- 搜索特定值很快(对数时间)
- 插入/删除您已经找到的值速度很快(重新平衡的时间很长)
- 遍历一系列值的速度很快(与哈希映射不同)
B 树与二叉树不同(“B”可能代表发明者的名字,但也可以代表“平衡”)。这是一个 B 树示例:
与二叉树不同,B 树中的每个节点可以有 2 个以上的子节点。每个节点最多可以有 m 个子节点,其中 m 称为树的“order”。为了保持树基本平衡,我们还说节点必须至少有 m/2 个子节点(向上舍入)。
我喜欢的古诗词
Fake data
当测试程序需要数据时,可以通过faker来构造测试数据
安装
1 | $ pip install faker |
基本使用
1 | from faker import Faker |
对方法 faker.ipv4()的每次调用都会产生不同的随机结果
1 | for _ in range(10): |
Commencement Address at Stanford University
Steve Jobs
I am honored to be with you today at your commencement from one of the finest universities in the world. Truth be told, I never graduated from college, and this is the closest I’ve ever gotten to a college graduation. Today I want to tell you three stories from my life. That’s it. No big deal. Just three stories.
The first story is about connecting the dots.
I dropped out of Reed College after the first 6 months, but then stayed around as a drop-in for another 18 months or so before I really quit. So why did I drop out?
It started before I was born. My biological mother was a young, unwed college graduate student, and she decided to put me up for adoption. She felt very strongly that I should be adopted by college graduates, so everything was all set for me to be adopted at birth by a lawyer and his wife. Except that when I popped out they decided at the last minute that they really wanted a girl.
Protocol Buffers使用
Tcpdump使用
简介
tcpdump是一个命令行数据包分析、抓取工具
可以使用 -D 标志来列出可用于捕获的接口
1 | $ tcpdump -D |
可以使用 -i 标志指定要捕获的接口,指定 any 作为接口将从所有活动接口捕获
1 | $ tcpdump -i any |
可以使用 -v 标志来调整tcpdump输出中的详细程度
1 | $ tcpdump -i any -v (Verbose output) |
协议过滤器
可以根据协议过滤捕获流量。例如,侦听所有TCP连接
1 | $ tcpdump tcp |
端口过滤器
如果只对特定端口的流量感兴趣,则可以使用端口过滤器来确定分析
1 | tcpdump port 80 |
将端口80作为其源端口或目标端口的流量,则可以使用
1 | $ tcpdump src port 80 |
主机过滤器
如果只对特定主机的流量感兴趣,则可以使用主机过滤器。主机过滤器还可以与源或目的过滤器组合。
1 | $ tcpdump host 1.2.3.4 |
组合滤波器
可以在tcpdump中组合多个过滤器
1 | $ tcpdump "src port 80" and "dst host 1.2.3.4" |
保存输出
可以使用 -w 将捕获的数据包保存到文件中
1 | $ tcpdump tcp -w FILE_PATH |
如果需要既保存又打印,可以将 –print 与 -w 结合使用
1 | $ tcpdump tcp -w FILE_PATH --print |
扩展
更多内容可参考tcpdump手册
The Pragmatic Programmer
The Pragmatic Programmer Quick Reference Guide
关心你的技艺
Care About Your Craft
如果你不在乎能否漂亮地开发出软件,你又为何要耗费生命去开发软件呢?思考!你的工作
Think!About Your Work
关掉自动驾驶,接管操作,不断地批评和评估你的工作提供各种选择,不要找蹩脚的借口
Provide Options, Don’t Make Lame Excuses
要提供各种选择,而不是找借口,不要说事情做不到,说明能够做什么不要容忍破窗户
Don’t Live with Broken Windows
当你看到糟糕的设计、错误的决策和糟糕的代码时,修正它们做变化的催化剂
Be a Catalyst for Change
你不能强迫人们改变。相反,要向他们展示未来可能会怎样,并帮助他们参与对未来的创造记住大图景
Remember the Big Picture
不要太过专注于细节,已忘了查看周围正在发生什么