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索引
- 不能建立降序索引的問題的解決索引
- 點陣圖索引(轉載)索引
- NumPy 陣列建立方法與索引訪問詳解陣列索引
- Python點陣圖索引學習Python索引
- 解決 / 最佳化問題的切入點
- 點陣圖索引的工作原理 - Richard索引
- CDP平臺:如何解決使用者畫像標籤資料不準的問題?
- Mysql索引失效問題demoMySql索引
- 解決zabbix圖形化中文亂碼問題
- 使用者畫像產品化——從零開始搭建實時使用者畫像(六)
- 簡化登入流程,助力應用建立使用者體系
- Lucene建立索引流程索引
- MySQL 中文 like 問題解決MySql
- mysql大小寫問題解決MySql
- 需求流程之產品願景和使用者畫像
- 使用者畫像
- 面試官出的MySQL索引問題,這篇文章全給你解決!面試MySql索引
- Mysql多列索引建立與優化.mdMySql索引優化
- mysql建立字首索引MySql索引
- MySql中文亂碼問題解決MySql
- 圖解MySQL索引(三)—如何正確使用索引?圖解MySql索引
- 停車場方點陣圖怎麼畫,停車場怎麼畫簡單一點的
- 國產化浪潮下TiDB解決的痛點問題TiDB
- 上手MySQL之解決問題:not allowed to connect to this MySQL serverMySqlServer
- 解決winform窗體重複建立問題ORM
- MYSQL索引建立需要注意以下幾點細節MySql索引
- bpmnjs-planel專案畫流程圖時任務監聽事件無法輸入欄位注入問題解決JS流程圖事件
- 解決圖片訪問403 Forbidden問題ORB
- MySQL索引建立原則MySql索引
- 解決bash: mysql: command not found的問題MySql
- 公司圖紙管理任務流程監督與簽章問題解決方案
- oracle點陣圖索引對DML操作的影響Oracle索引
- 帶您瞭解TRIZ理論解決問題的流程
- Mysql mysql lost connection to server during query 問題解決方法MySqlServer
- MySQL索引簡介MySql索引
- 【Mysql】索引簡介MySql索引