为满足用户标签的统计需求,可以利用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不仅方便查询,还可以去除掉重复的整型数。
具体应用在这个例子上具体可以参考下面博客: