本文的靈感來源於京東金融數據部張洪雨同學的項目經歷,感謝這位大神的技術分享。
為滿足用戶標簽的統計需求,小灰利用 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 數據庫。
轉載:樊浩柏科學院