转自 伯乐专栏 玻璃猫
本文的灵感来源于京东金融数据部张洪雨同学的项目经历,感谢这位大神的技术分享。
为满足用户标签的统计需求,小灰利用 MySQL 设计了如下的表结构,每一个维度的标签都对应着 MySQL 表的一列:
要想统计所有 90 后的程序员该怎么做呢?
用一条求交集的 SQL 语句即可:
SELECT COUNT(DISTINCT name) AS 用户数 FROM table WHERE age = '90后' AND occupation = '程序员' |
要想统计所有使用苹果手机或者 00 后的用户总合该怎么做?用一条求并集的 SQL 语句即可:
SELECT COUNT(DISTINCT name) AS 用户数 FROM table WHERE phone = '苹果' OR age = '00后' |
两个月之后——
———————————————
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 不仅方便查询,还可以去除掉重复的整型数。
1.建立用户名和用户 ID 的映射。
2.让每一个标签存储包含此标签的所有用户 ID,每一个标签都是一个独立的 bitmap。
3.这样,实现用户的去重和查询统计,就变得一目了然。
1.如何查找使用苹果手机的程序员用户?
2.如何查找所有男性或者00后的用户?
说明:该项目最初的技术选型并非 MySQL,而是内存数据库 hana。本文为了便于理解,把最初的存储方案写成了 MySQL 数据库。
漫画算法系列 »
- 漫画算法:最小栈的实现
- 漫画算法:判断 2 的乘方
- 漫画算法:找出缺失的整数
- 漫画算法:辗转相除法是什么鬼?
- 漫画算法:什么是动态规划?(整合版)
- 漫画算法:什么是跳跃表?
- 漫画算法:什么是 B 树?
- 漫画算法:什么是 B+ 树?
- 漫画算法:什么是一致性哈希?
- 漫画算法:无序数组排序后的最大相邻差值