之前看书或者浏览博客中遇到过的一些有趣的题,记录下来。
在阅读《MySQL高性能》这本书索引部分的时候,看到其中某一段描述,大意是:
在数据量大的情况下,可以对某个键做hash,求出hashcode,然后对hashcode做索引。数据量大了,直接用B+树索引的话,搜索会变的很慢,比如说数据量上亿条,B+索引就会很慢;而如果换一种思路,不直接对之间的key字段建立索引,而是根据某种规则,让对key进行hash后的code有一定几率重复,然后对这个hashcode建立索引,那么就会一定程度上提高MySQL的查询速度,虽然这回占用额外的空间。
因为innodb引擎的索引是B+树数据结构,所以对于这种有重复key的数据,就会有比较好的查询效率支持。
想到的另外一个解决方案:
可以根据hashcode的大小范围,存进多个表里面,比如说1亿条数据,那么我建立100个表,这样每个表里面大约会保存100w条数据,规模降到了100w级,那么查询效率就会高很多。
类似的一个问题:
在Go中map是非并发安全的,那么如果有一种场景下,我们只能有一个map,但map里面存了上百万条数据,测试显示,当map里面的数达到10w级别的时候就会触发并发安全问题,那么这个时候又该怎么办呢?
类似的,我们可以在一个map里面村上成百上千个二级map,每个二级map里面存真实的数据。这样我们只要建立一套hash规则,对于某个范围的hashcode,存放到相应的二级map里面就可以了。分而治之的思想。
同样的思路还有,当并发达到一定程度之后,就需要添加多台服务器以提高吞吐,10台机器不够我们可以加到100台。
像这类小trick还是有必要记录下来的,遇到相关场景会有关键作用。