bitmap的秒用-优化存储

为满足用户标签的统计需求,可以利用Mysql设计了如下的表结构,每一个维度的标签都对应着Mysql表的一列:

name age sex work phone
小美 21 程序员 苹果
小明 32 程序员 三星
小丽 21 经理 苹果

要想统计所有21岁的程序员该怎么做呢?

用一条求交集的SQL语句即可:

Select count(distinct Name) as 用户数 from table whare age = '21' and work = '程序员' ;

要想统计所有使用苹果手机或者21岁的用户总合该怎么做?

用一条求并集的SQL语句即可:
 

Select count(distinct Name) as 用户数 from table whare phone = '苹果' or age = '21' ;

在随着用户的标签增多的变化下,如果接着采取SQL语句进行拼接来完成查询的话,效率会下降,因为SQL语句会越来越长,接下来我们采取bitmap来存储。

利用的是内存中连续的二进制位,用于大量数据的去重和查询。

例如插入整型数4、2、1、3

1. 给定长度是10的bitmap,每一个bit位分别对应着从0到9的10个整型数。此时bitmap的所有位都是0。

2. 把整型数4存入bitmap,对应存储的位置就是下标为4的位置,将此bit置为1。

3. 把整型数2存入bitmap,对应存储的位置就是下标为2的位置,将此bit置为1。

4. 把整型数1存入bitmap,对应存储的位置就是下标为1的位置,将此bit置为1。

5. 把整型数3存入bitmap,对应存储的位置就是下标为3的位置,将此bit置为1。

要问此时bitmap里存储了哪些元素?显然是4,3,2,1,一目了然。

Bitmap不仅方便查询,还可以去除掉重复的整型数。

具体应用在这个例子上具体可以参考下面博客:

https://juejin.im/post/5c4fd2af51882525da267385

猜你喜欢

转载自blog.csdn.net/weixin_30363263/article/details/86712043