bitmap就是在一個二進制的數據中,每個位表明必定的含義,這樣最終只須要存一個整型數據,就能夠解釋出多個含義.
業務中有一個字段專門用來存儲用戶對某些功能的開啓和關閉,若是是傳統的思惟,確定是建一個字段來存0表明關閉,1表明開啓,那麼若是功能不少或者須要加功能開關,就須要不停的建立字段.
使用bitmap的思路就只須要一個字段就能夠了,建一個entuserstatus字段,該字段的二進制表示中,從右到作數,從1開始數.好比第19位表明是否開始歸檔,那麼就直接操做這一位的0和1就能夠表示該用戶是否開啓歸檔功能.算法
email表的第19位,做爲歸檔開啓的位,1是開啓 0是關閉;262144表明是第19位爲1的十進制數
查詢開啓的
select email,enterpriseId from email where entuserstatus & 262144=262144;
開啓歸檔
update email set entuserstatus = entuserstatus|262144 where id=670602 limit 1
關閉歸檔
update email set entuserstatus = entuserstatus^262144 where id=670602 limit 1it
另外一種形式
查詢開啓歸檔的
select id,email,enterpriseId,entuserstatus from email where entuserstatus>>18 & 1=1;
開啓歸檔
update email set entuserstatus = entuserstatus|(1<<18) where id=670602 limit 1
關閉歸檔
update email set entuserstatus = entuserstatus^(1<<18) where id=670602 limit 1email
異或(^)運算
異或運算通俗地講就是一句話
同爲假,異爲真
因此它是這樣的算法:
0&0=0,0&1=1,1&0=1,1&1=0date