MySQL點陣圖索引解決使用者畫像問題(簡化建立流程)
基於前文,建立索引的時候有一個問題
每個bigint型別包括60個記錄的位資訊.
但是第0位表示第六十個記錄的位
第1位至第59位表示第一至五十九的記錄的位資訊.
這樣記錄的位資訊儲存並不連續,
使用的時候還得把最右邊的一位挪到最左邊,不好理解還非常麻煩,效能也有損耗.
經過王工的改良,
使用如下sql替換,則儲存的位資訊就連續了
SELECT CEIL(id / 60) g60, CEIL(id / 1200) g1200, age grouped, COUNT(*) total, BIT_OR(1 << (if(MOD(id, 60)=0,60,MOD(id, 60)))) bitmap FROM o_huaxiang_big_0 o GROUP BY g1200 , g60 , age
建立點陣圖索引的整體SQL如下
truncate table bitmap20_0; insert into bitmap20_0 select 'o_huaxiang_big' table_name, 'umc_sex' column_name, ((g1200-1)*60)*20 min_id, ((g1200-1)*60)*20+1200 max_id, v2.* from ( select g1200, grouped, sum(total) total, ifnull(max(case when abs((g1200-1)*20-g60)=20 then bitmap else null end),0) c20, ifnull(max(case when abs((g1200-1)*20-g60)=19 then bitmap else null end),0) c19, ifnull(max(case when abs((g1200-1)*20-g60)=18 then bitmap else null end),0) c18, ifnull(max(case when abs((g1200-1)*20-g60)=17 then bitmap else null end),0) c17, ifnull(max(case when abs((g1200-1)*20-g60)=16 then bitmap else null end),0) c16, ifnull(max(case when abs((g1200-1)*20-g60)=15 then bitmap else null end),0) c15, ifnull(max(case when abs((g1200-1)*20-g60)=14 then bitmap else null end),0) c14, ifnull(max(case when abs((g1200-1)*20-g60)=13 then bitmap else null end),0) c13, ifnull(max(case when abs((g1200-1)*20-g60)=12 then bitmap else null end),0) c12, ifnull(max(case when abs((g1200-1)*20-g60)=11 then bitmap else null end),0) c11, ifnull(max(case when abs((g1200-1)*20-g60)=10 then bitmap else null end),0) c10, ifnull(max(case when abs((g1200-1)*20-g60)=9 then bitmap else null end),0) c9, ifnull(max(case when abs((g1200-1)*20-g60)=8 then bitmap else null end),0) c8, ifnull(max(case when abs((g1200-1)*20-g60)=7 then bitmap else null end),0) c7, ifnull(max(case when abs((g1200-1)*20-g60)=6 then bitmap else null end),0) c6, ifnull(max(case when abs((g1200-1)*20-g60)=5 then bitmap else null end),0) c5, ifnull(max(case when abs((g1200-1)*20-g60)=4 then bitmap else null end),0) c4, ifnull(max(case when abs((g1200-1)*20-g60)=3 then bitmap else null end),0) c3, ifnull(max(case when abs((g1200-1)*20-g60)=2 then bitmap else null end),0) c2, ifnull(max(case when abs((g1200-1)*20-g60)=1 then bitmap else null end),0) c1 from ( SELECT CEIL(id / 60) g60, CEIL(id / 1200) g1200, umc_sex grouped, COUNT(*) total, BIT_OR(1 << (if(MOD(id, 60)=0,60,MOD(id, 60)))) bitmap FROM o_huaxiang_big_0 o GROUP BY g1200 , g60 , umc_sex ) v1 group by g1200,grouped ) v2; insert into bitmap20_0 select 'o_huaxiang_big' table_name, 'age' column_name, ((g1200-1)*60)*20 min_id, ((g1200-1)*60)*20+1200 max_id, v2.* from ( select g1200, grouped, sum(total) total, ifnull(max(case when abs((g1200-1)*20-g60)=20 then bitmap else null end),0) c20, ifnull(max(case when abs((g1200-1)*20-g60)=19 then bitmap else null end),0) c19, ifnull(max(case when abs((g1200-1)*20-g60)=18 then bitmap else null end),0) c18, ifnull(max(case when abs((g1200-1)*20-g60)=17 then bitmap else null end),0) c17, ifnull(max(case when abs((g1200-1)*20-g60)=16 then bitmap else null end),0) c16, ifnull(max(case when abs((g1200-1)*20-g60)=15 then bitmap else null end),0) c15, ifnull(max(case when abs((g1200-1)*20-g60)=14 then bitmap else null end),0) c14, ifnull(max(case when abs((g1200-1)*20-g60)=13 then bitmap else null end),0) c13, ifnull(max(case when abs((g1200-1)*20-g60)=12 then bitmap else null end),0) c12, ifnull(max(case when abs((g1200-1)*20-g60)=11 then bitmap else null end),0) c11, ifnull(max(case when abs((g1200-1)*20-g60)=10 then bitmap else null end),0) c10, ifnull(max(case when abs((g1200-1)*20-g60)=9 then bitmap else null end),0) c9, ifnull(max(case when abs((g1200-1)*20-g60)=8 then bitmap else null end),0) c8, ifnull(max(case when abs((g1200-1)*20-g60)=7 then bitmap else null end),0) c7, ifnull(max(case when abs((g1200-1)*20-g60)=6 then bitmap else null end),0) c6, ifnull(max(case when abs((g1200-1)*20-g60)=5 then bitmap else null end),0) c5, ifnull(max(case when abs((g1200-1)*20-g60)=4 then bitmap else null end),0) c4, ifnull(max(case when abs((g1200-1)*20-g60)=3 then bitmap else null end),0) c3, ifnull(max(case when abs((g1200-1)*20-g60)=2 then bitmap else null end),0) c2, ifnull(max(case when abs((g1200-1)*20-g60)=1 then bitmap else null end),0) c1 from ( SELECT CEIL(id / 60) g60, CEIL(id / 1200) g1200, age grouped, COUNT(*) total, BIT_OR(1 << (if(MOD(id, 60)=0,60,MOD(id, 60)))) bitmap FROM o_huaxiang_big_0 o GROUP BY g1200 , g60 , age ) v1 group by g1200,grouped ) v2;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2199592/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL點陣圖索引解決使用者畫像問題MySql索引
- 優化-mysql子查詢索引失效問題解決優化MySql索引
- 不能建立降序索引的問題的解決索引
- Oracle索引——點陣圖索引Oracle索引
- 點陣圖索引(Bitmap Index)——從B*樹索引到點陣圖索引索引Index
- 點陣圖索引.sql索引SQL
- 點陣圖索引(Bitmap Index)——索引共用索引Index
- 建立聯合函式索引解決top sql效能問題函式索引SQL
- 點陣圖索引(Bitmap Index)——點陣圖索引與資料DML鎖定索引Index
- 點陣圖索引導致的會話阻塞問題(p7)索引會話
- Oracle-點陣圖索引Oracle索引
- 【基礎知識】索引--點陣圖索引索引
- 關於點陣圖索引的split及bitmap to rowid實現問題索引
- NumPy 陣列建立方法與索引訪問詳解陣列索引
- 使用點陣圖選單項——建立點陣圖 (轉)
- 使用者畫像產品化——從零開始搭建實時使用者畫像(六)
- oracle 點陣圖索引(bitmap index)Oracle索引Index
- 點陣圖索引:原理(BitMap index)索引Index
- 點陣圖索引(bitmap-index)索引Index
- 解決 / 最佳化問題的切入點
- 使用點陣圖連線索引優化OLAP查詢索引優化
- 需求流程之產品願景和使用者畫像
- CDP平臺:如何解決使用者畫像標籤資料不準的問題?
- 【點陣圖索引】在點陣圖索引列上進行更新操作的鎖代價研究索引
- 使用點陣圖連線索引最佳化OLAP查詢索引
- Python點陣圖索引學習Python索引
- 點陣圖索引的工作原理 - Richard索引
- bitmap index點陣圖索引系列(一)Index索引
- 解決zabbix圖形化中文亂碼問題
- 簡化登入流程,助力應用建立使用者體系
- 建立點陣圖選單 (轉)
- 《盜墓筆記》IP使用者畫像——資訊圖筆記
- JOB建立,解決網友問題
- Lucene建立索引流程索引
- 使用點陣圖索引和星形轉換優化OLAP查詢索引優化
- MySQL 中文 like 問題解決MySql
- mysql大小寫問題解決MySql
- 解決Redmine建立&更新問題時很慢的問題