谁立志要建立属于自己的MySQL帝国呢?

摘要:我是小M,我在卡拉巴拉星球。 我喜欢数据,我立志成为一个数据管理者。 所以我来 Y 公司应聘,听说他们的数据量挺大的。 面试过程还是挺简单的。 我用 007 这三个数字就轻易打败了一堆吹嘘 996 的应聘者。 此刻,我独领风骚。 1 今天是
我是小M,我在卡拉巴拉星球。 我喜欢数据,我立志成为一个数据管理者。 所以我来 Y 公司应聘,听说他们的数据量挺大的。 面试过程还是挺简单的。 我用 007 这三个数字就轻易打败了一堆吹嘘 996 的应聘者。 此刻,我独领风骚。 1 今天是我第一天上班,我笔直地坐在工位上,等着老板的宠幸。 下午两点。 Y 老板推门而入,打着哈欠看着我:“007,你背有问题?坐得这么直?” “老板你好,我叫小M,不是叫 007 ,007 是我对公司的热爱,是我的毕生....” “打住打住,看到你前面办公桌上十几条数据了么?” “你的任务就是管理好它们,这些数据随时会增加、查阅、删除、更新的哦。” 我激动着、颤抖着回答:“Yes,Sir!” 2 花了10分钟的时间,我把桌上的数据都扫视了一遍。 是的,没错,就十几条数据我花了十分钟。 因为这是我的第一份工作,我热爱! 这些数据都来自一个叫 User 的部门,它们都有一样的结构: 这堆数据的 ID 都是有规律的,我想着就按顺序把它排排坐,我用链表将它们相连。 每次查找数据,我从头开始遍历往后找就行了,有序,简单。 我真是个小天才。 就这样日复一日,年复一年,User 的数据在不断的增加,现在已经多达百条了。 这个链表也越来越长,每次老板来找我要数据,我查找的时间也越来越慢。 而且不仅是大老板,我发现好多小老板也来找我要数据。 我快要累死了,我的腰渐渐地也直不起来了。 3 5月1号深夜,今天是劳动节。 我依旧在公司加班。 我想不能再这样下去了,是时候祭出我的秘密武器了! 只有在夜深人静一个人的时候,我才能召唤它! 螺蛳粉! 没错,就是它! 因为我发现,嗦了螺蛳粉之后,我的脑子特别清晰,思维特别地发散。 为此,我还特意去医院检查了下脑子,医生说从片子上看的话一切正常,不过从感觉上看我可能不太正常。 不管了,反正我知道,螺蛳粉确实能赋予我通透的头脑。 因为,此时我的脑子已经开始动起来了! 有了! 我忽然回想起,在大学里面有一门叫《数据结构》的课程里讲了二分法。 现在有近一千条有序的数据,我把它按每十条数据分为一组,于是我吭哧吭哧的一顿操作。 (为了美观,就画10组)然后我再为每一组都配置一个槽,每个槽记录了每组最大的那条记录的地址。 这样,我就可以通过二分法快速查找记录啦! 假设现在就10组数据,然后我要找 ID 等于 12 这条数据,我就: 先计算中间槽的位置(1+10)/2=5,通过地址找到第五组,此时第五组ID是50,12<50,所以继续二分。 (1+5)/2=3,通过地址找到第三组,此时第三组ID是30,12<30,所以继续二分。 (1+3)/2=2,通过地址找到第二组,此时第二组ID是20,12<20,所以继续二分。 (1+2)/2=1,通过地址找到第一组,此时第一组ID是10,12>10,现在能断定12在第二组。 从图中看起来第一组和第二组是分开的?实际上地址是相连的,所以通过第一组最后一条数据,可以往后随着单向链表遍历,找到ID为12的这条数据。 是不是很方便? 总结的来说: 先通过二分法找到数据所在的槽。 然后再通过单向链表遍历得到数据。 在数据量很大的时候这种查找方式非常快速! 因为查找数据的时间复杂度从O(n)几乎简化成了O(lgn)! 我称之为页目录,我可真是个小天才呢! 4 就这样,日复一日,年复一年。 User 的数据量还在逐日增加。 我发现每次查询都需要掏出全部的名单来找。 我这小胳膊细腿的,都快抬不动了。 于是,在一个月黑风高的夜晚,我又掏出了螺蛳粉。 灵光乍现! 我以一千个数据为一个界限来分割数据,我将每一千个数据称之为页。 没错,我又想出了 idea,我将所有数据分为一页一页,每页之间用双向链表相连。 这样每次查询,我就不需要一次把有所数据都拉出来,我可以一页一页翻阅过去。 当然,页内部还是按照刚才那样分组访问。 现在我是这样查找数据的: 每次查数据我从第一页开始找。 然后按照页内查找的方式二分去查数据,找不到就通过链表访问下一页。 因此,访问速度并没有变快,只是每次不需要把数据全部捞出来,只要一页一页的捞。 我的胳膊得到了解放。 5 公司越来越大,User 的数据爆炸性增长。 分的页也越来越多,老板和小老板们开始抱怨了。 老板说,“我让你找个人,你找了1小时?你今年年终奖还想不想要了!” “唉,那个人在最后一页,我翻的要死才翻到,我太难了!” 虽说在心里抱怨,但是我知道这样下去不是办法。 头可断血可流,年终奖不可少! 别问,问就是螺蛳粉! 果不其然,螺蛳粉是无敌的。
阅读全文