那天夜里的时候,我去十三哥屋里找他,他正在敲代码。平时我找他, 都是谈技术,毕竟都是程序员,除了这一点,其它的共同爱好,我们也没有。
不过这一次,不是谈技术。房子要到期了,我是要问他,是继续合租,还是各寻它途。 他说要去北方,他女朋友在北方。这点我理解,我要去东南,我女朋友在东南。
租房的事情谈过后,他向我扬扬眉,有个好东西,说要告诉我。 我知道,他在炫耀,他想装逼,他有准备。 我想用嘲笑,压制他的炫耀,但我没有,而是故做平静的说:说说看。
他说他们公司,遇到一个问题,一个 mongodb 的数据库,查询时间太长。 我点点头,表示让他继续。他说之前还好,数据量比较少,这段时间业务很好, 数据开始增多,查询经常超时。我皱下眉,表示一下困惑。他继续说, 索引也加了,能优化的都优化了,仍然超时。我看着他,没有表情,等着他继续。 他停顿了一下,然后问我,你觉得怎么办?我说我想想。
我不说话,看着屋顶。他笑着看着我,看着我苦苦的思索,等待着我的答案。 我低下头,没有说答案,而是问向他,他们是怎么解决的。
他说那天下午,他们老大找到他,讲了相同的事情,问了相同的问题,他也没有回答。 他的老大笑笑,说可以"分表"啊。之前的表里面,放着所有的记录,数据快到六百万时, 出现了查询超时,如果按照业务划分,可以分成十几个表,每个业务的数据,只放到自己的表里, 每个表的数据,都会降低很多。 他们建了新表,旧表保持原样,只在旧表增加,不再进行查询,查询操作,都转移到了新表。 新表的字段,也由旧表的九个,变为现在的四个,这四个是必须的,多余的全部去除。 他们分表过后,效果确实很好,每次都不超时。
他看着我,表情透着满足,那是学到新知识后的表情。
我继续问他,他们的业务有多少,他说十八个。我说那就是十八个表,他说是的。 我又问他,数据最多的业务,占总数据的多少,他说大概一半。 我继续问,如果说,我说如果,你们公司很牛逼,所有业务都增长加倍, 目前最好的业务,以后的数据量,可能和现在的总数据量一样,那时候该怎么办?
他皱皱眉,说确实也是个问题。
我问他,查询时的条件,是什么数据类型,他说三十六位的字符串,类似 MD5。 我说可以对这个字段做 HASH ,散列到多个表,比如 128 个表,如果 HASH 函数选的比较好, 结果比较随机,那么每个表的数据,也会比较随机,表里的数据就会比较平均, 这样就能让表里的数据,降低两个数量级。而且业务改变了,也不影响表的结构。
他说看起来,这样倒也行。
他问我,这方法,是从哪里看到的,我说自己想到的。他说别吹牛逼,快点告诉我。 我说我也忘了,这是我自己想到的,还是从哪里看到的。不过现在,这知识已经和我融为一体,那就是我的了。
十三哥戏谑的看着我,说:你又开始装逼了......