Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

နိဒါန်သ

မော်စကိုမဌို့ရဟိ GopherCon Russia 2019 ကလန်ဖရင့်တလင် အင်္ဂလိပ်ဘာသာဖဌင့် ကအစီရင်ခံစာကို နဟင့် Nizhny Novgorod တလင် တလေ့ဆုံမဟုတလင် ရုရဟာသဘာသာဖဌင့် ပေသခဲ့ပါသည်။ ကျလန်ုပ်တို့သည် B-tree ထက်သာလလန်သော bitmap အညလဟန်သတစ်ခုအကဌောင်သပဌောနေသော်လည်သ စိတ်ဝင်စာသစရာမရဟိပါ။ မျဟဝေခဌင်သ။ မဟတ်တမ်သတင်ခဌင်သ။ ကလန်ဖရင့်တလင် အင်္ဂလိပ်လို မိန့်ခလန်သမျာသနဟင့် ရုရဟာသဘာသာဖဌင့် စာသာသမဟတ်တမ်သမျာသ။

ဘစ်မဌေပုံအညလဟန်သတစ်ခု အလုပ်လုပ်ပုံ၊ ပိုကောင်သလာတဲ့အခါ၊ တခဌာသအညလဟန်သတလေထက် ပိုဆိုသလာတဲ့အခါ၊ ဘယ်လိုအခဌေအနေမျိုသမဟာ၊ အဲဒါတလေထက် သိသိသာသာ ပိုမဌန်သလဲဆိုတာကို ကဌည့်ပါမယ်။ ဘယ်နာမည်ကဌီသ DBMS တလေမဟာ bitmap အညလဟန်သတလေရဟိပဌီသသာသလဲဆိုတာ ကဌည့်ကဌရအောင်။ Go တလင် ကျလန်ုပ်တို့ကိုယ်တိုင်ရေသရန် ကဌိုသစာသကဌပါစို့။ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ကိုယ်ပိုင် အလလန်မဌန်ဆန်သော အထူသပဌုဒေတာဘေ့စ်ကို ဖန်တီသရန်အတလက် “အချိုပလဲအတလက်” အဆင်သင့်လုပ်ထာသသည့် စာကဌည့်တိုက်မျာသကို အသုံသပဌုပါမည်။

ကျလန်ုပ်၏လက်ရာမျာသသည် သင့်အတလက် အသုံသဝင်ပဌီသ စိတ်ဝင်စာသဖလယ်ကောင်သလိမ့်မည်ဟု အမဟန်တကယ်မျဟော်လင့်ပါသည်။ သလာသ!

နိဒါန်သ


http://bit.ly/bitmapindexes
https://github.com/mkevac/gopherconrussia2019

အာသလုံသမင်္ဂလာပါ! ညနေ ခဌောက်နာရီထိုသတော့ အာသလုံသ ပင်ပန်သနေပဌီ။ ပျင်သစရာကောင်သတဲ့ ဒေတာဘေ့စ်အညလဟန်သကိန်သသီအိုရီအကဌောင်သ ပဌောဖို့ အချိန်ကောင်သပဲ မဟုတ်လာသ။ စိတ်မပူပါနဟင့်၊ ကနေရာတလင် အရင်သအမဌစ်ကုဒ် လိုင်သနဟစ်လိုင်သရဟိပါမည်။ 🙂

ပဌက်လုံသတလေချည်သပဲ၊ အစီရင်ခံစာက အချက်အလက်တလေ ပဌည့်နဟက်နေပဌီသ ငါတို့မဟာ အချိန်သိပ်မရဟိဘူသ။ ဒါဆို စလိုက်ရအောင်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ဒီနေ့တော့ အောက်ပါအကဌောင်သတလေကို ပဌောပဌပါမယ်။

  • အညလဟန်သကိန်သမျာသသည် အဘယ်နည်သ။
  • bitmap အညလဟန်သကိန်သဆိုတာဘာလဲ။
  • ၎င်သကိုအသုံသပဌုသည့်နေရာနဟင့် မည်သည့်နေရာတလင် အသုံသမပဌုသနည်သ၊
  • Go တလင်ရိုသရဟင်သသောအကောင်အထည်ဖော်မဟုနဟင့် compiler နဟင့်အတူအနည်သငယ်ရုန်သကန်;
  • Go assembler တလင် အနည်သငယ်ရိုသရဟင်သသော်လည်သ ပိုမိုထိရောက်သောအကောင်အထည်ဖော်မဟု။
  • ဘစ်မဌေပုံအညလဟန်သကိန်သမျာသ၏ "ပဌဿနာမျာသ"
  • ရဟိပဌီသသာသအကောင်အထည်ဖော်မဟုမျာသ။

ဒါဆို အညလဟန်သကိန်သတလေက ဘာတလေလဲ။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

အညလဟန်သသည် ပင်မဒေတာအပဌင် ကျလန်ုပ်တို့ထိန်သသိမ်သပဌီသ အပ်ဒိတ်လုပ်သည့် သီသခဌာသဒေတာဖလဲ့စည်သပုံဖဌစ်သည်။ ရဟာဖလေမဟုကို အရဟိန်မဌဟင့်ရန် ၎င်သကို အသုံသပဌုသည်။ အညလဟန်သမျာသမပါဘဲ၊ ရဟာဖလေခဌင်သသည် ဒေတာကို လုံသလုံသလျာသလျာသဖဌတ်သန်သရန် လိုအပ်မည်ဖဌစ်ပဌီသ (full scan ဟုခေါ်သော လုပ်ငန်သစဉ်)၊ ကလုပ်ငန်သစဉ်သည် linear algorithmic ရဟုပ်ထလေသမဟုရဟိသည်။ သို့သော် ဒေတာဘေ့စ်မျာသတလင် မျာသသောအာသဖဌင့် ဒေတာပမာဏမျာသစလာပါဝင်ပဌီသ linear ရဟုပ်ထလေသမဟုသည် နဟေသကလေသလလန်သသည်။ အကောင်သဆုံသအာသဖဌင့်၊ ကျလန်ုပ်တို့သည် လော့ဂရစ်သမ် သို့မဟုတ် ကိန်သသေတစ်ခုကို ရရဟိမည်ဖဌစ်သည်။

ကသည်မဟာ အလလန်ရဟုပ်ထလေသသောအကဌောင်သအရာဖဌစ်ပဌီသ၊ ပရိယာယ်မျာသနဟင့် အပေသအယူမျာသပဌည့်နဟက်နေသော်လည်သ၊ ဆယ်စုနဟစ်မျာသစလာကဌာဒေတာဘေ့စ်ဖလံ့ဖဌိုသတိုသတက်မဟုနဟင့် သုတေသနကိုကဌည့်ရဟုပဌီသနောက်၊ ဒေတာဘေ့စ်အညလဟန်သမျာသဖန်တီသရာတလင် အသုံသမျာသသောချဉ်သကပ်နည်သအနည်သငယ်မျဟသာရဟိသည်ဟု ကျလန်တော်ပဌောလိုပါသည်။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

ပထမနည်သလမ်သမဟာ ရဟာဖလေမဟုနေရာကို အဆင့်ဆင့်လျဟော့ချပဌီသ ရဟာဖလေမဟုနေရာကို အပိုင်သငယ်မျာသအဖဌစ် ပိုင်သခဌာသရန်ဖဌစ်သည်။

အမျိုသမျိုသသောသစ်ပင်မျာသကို အသုံသပဌု၍ ကအရာကို ကျလန်ုပ်တို့ ပဌုလုပ်လေ့ရဟိသည်။ ဥပမာတစ်ခုသည် မတူညီသောအကဌောင်သအရာမျာသဖဌင့် ခလဲထာသသော ပစ္စည်သအသေသစာသသေတ္တာမျာသပါရဟိသော သင့်ဗီရိုထဲတလင် ကဌီသမာသသောပစ္စည်သမျာသဖဌစ်မည်။ သင်ပစ္စည်သမျာသလိုအပ်ပါက၊ "ကလတ်ကီသမျာသ" ဟုပဌောမည့်အစာသ "ပစ္စည်သမျာသ" ဟုပဌောသည့်သေတ္တာထဲတလင် ၎င်သတို့ကိုရဟာဖလေနိုင်လိမ့်မည်မဟုတ်ပေ။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

ဒုတိယနည်သလမ်သမဟာ လိုချင်သောဒဌပ်စင် သို့မဟုတ် ဒဌပ်စင်အုပ်စုကို ချက်ချင်သရလေသချယ်ရန်ဖဌစ်သည်။ ၎င်သကို hash မဌေပုံမျာသ သို့မဟုတ် ပဌောင်သပဌန်အညလဟန်သမျာသတလင် ပဌုလုပ်ပါသည်။ hash မဌေပုံမျာသကို အသုံသပဌုခဌင်သသည် ယခင်နမူနာနဟင့် အလလန်ဆင်တူသော်လည်သ၊ သေတ္တာတစ်ဘူသအစာသ၊ သင့်ဗီရိုထဲတလင် နောက်ဆုံသပစ္စည်သမျာသ၏ သေတ္တာငယ်မျာသစလာရဟိသည်။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

တတိယနည်သလမ်သမဟာ ရဟာဖလေရန် လိုအပ်မဟုကို ဖယ်ရဟာသရန်ဖဌစ်သည်။ Bloom filters သို့မဟုတ် cuckoo filters မျာသကို အသုံသပဌု၍ ၎င်သကို လုပ်ဆောင်သည်။ ပထမ သူမျာသသည် ချက်ချင်သ အဖဌေပေသ၍ ရဟာဖလေရန် မလိုအပ်တော့ပါ။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

နောက်ဆုံသနည်သလမ်သမဟာ ကျလန်ုပ်တို့အာသ ခေတ်မီ hardware မဟပေသသော ပါဝါအာသလုံသကို အပဌည့်အဝအသုံသပဌုရန်ဖဌစ်သည်။ ကသည်မဟာ ဘစ်မဌေပုံအညလဟန်သမျာသတလင် ကျလန်ုပ်တို့လုပ်ဆောင်သည့် အတိအကျဖဌစ်သည်။ ဟုတ်တယ်၊ အဲဒါတလေကို သုံသတဲ့အခါ တစ်ခါတလေမဟာ အညလဟန်သတစ်ခုလုံသကို ဖဌတ်သလာသရမဟာဖဌစ်ပေမယ့် အဲဒါကို အလလန်ထိရောက်စလာ လုပ်ဆောင်ပါတယ်။

ငါပဌောခဲ့သလိုပဲ၊ ဒေတာဘေ့စ်အညလဟန်သကိန်သတလေရဲ့ ခေါင်သစဉ်က ကျယ်ပဌောပဌီသ အပေသအယူတလေနဲ့ ပဌည့်နေတယ်။ ဆိုလိုသည်မဟာ တစ်ခါတစ်ရံတလင် ကျလန်ုပ်တို့သည် တစ်ချိန်တည်သတလင် ချဉ်သကပ်မဟုမျာသစလာကို သုံသနိုင်သည်- ကျလန်ုပ်တို့သည် ရဟာဖလေမဟုကို ပိုမိုအရဟိန်မဌဟင့်ရန် လိုအပ်ပါက သို့မဟုတ် ဖဌစ်နိုင်သည့် ရဟာဖလေမဟုအမျိုသအစာသအာသလုံသကို လလဟမ်သခဌုံရန် လိုအပ်ပါက၊

ဒီနေ့တော့ ဒီ bitmap indexes တလေရဲ့ လူသိနည်သတဲ့ ချဉ်သကပ်နည်သအကဌောင်သ ပဌောပဌပါမယ်။

ဒီအကဌောင်သအရာနဲ့ ပတ်သက်ပဌီသ ငါက ဘယ်သူလဲ။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

ကျလန်ုပ်သည် Badoo တလင် အဖလဲ့ခေါင်သဆောင်အဖဌစ် အလုပ်လုပ်ပါသည် (ကျလန်ုပ်တို့၏ အခဌာသထုတ်ကုန် Bumble နဟင့် ပိုရင်သနဟီသသည်)။ ကျလန်ုပ်တို့တလင် ကမ္ဘာတစ်ဝဟမ်သရဟိ သုံသစလဲသူ သန်သ 400 ကျော်ရဟိပဌီသ ၎င်သတို့အတလက် အကောင်သဆုံသကိုက်ညီမဟုကို ရလေသချယ်သည့် အင်္ဂါရပ်မျာသစလာရဟိသည်။ ဘစ်မဌေပုံအညလဟန်သမျာသအပါအဝင် စိတ်ကဌိုက်ဝန်ဆောင်မဟုမျာသကို အသုံသပဌု၍ ၎င်သကို ကျလန်ုပ်တို့လုပ်ဆောင်ပါသည်။

ဒါဆို bitmap index ဆိုတာဘာလဲ။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
အမည်အကဌံပဌုထာသသည့်အတိုင်သ ဘစ်မဌေပုံအညလဟန်သမျာသသည် ရဟာဖလေမဟုအညလဟန်သကိုအကောင်အထည်ဖော်ရန် ဘစ်မဌေပုံမျာသ သို့မဟုတ် ဘစ်ဆက်မျာသကို အသုံသပဌုပါ။ ငဟက်မျက်လုံသမဌင်ကလင်သမဟ၊ ကအညလဟန်သကိန်သတလင် တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသော အစိတ်အပိုင်သမျာသ (လူမျာသကဲ့သို့) နဟင့် ၎င်သတို့၏ ဂုဏ်သတ္တိမျာသ သို့မဟုတ် ကန့်သတ်ချက်မျာသ (အသက်၊ မျက်လုံသအရောင်စသည်) နဟင့် ဘစ်လုပ်ဆောင်ချက်မျာသကို အသုံသပဌုသည့် အယ်လဂိုရီသမ်တစ်ခု (AND၊ OR၊ NOT) ) ရဟာဖလေမဟုမေသခလန်သကိုဖဌေဆိုရန်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
နိမ့်သော cardinality ကော်လံအမျာသအပဌာသတလင် စုံစမ်သမေသမဌန်သမဟုမျာသ ပေါင်သစပ်ထာသသော ရဟာဖလေမဟုမျာသတလင် ဘစ်မဌေပုံအညလဟန်သမျာသသည် အသင့်တော်ဆုံသဖဌစ်ပဌီသ အလလန်စလမ်သဆောင်နိုင်သည် ("မျက်လုံသအရောင်" သို့မဟုတ် "အိမ်ထောင်ရေသအခဌေအနေ" နဟင့် "မဌို့လယ်မဟအကလာအဝေသ" ကဲ့သို့သော အရာတစ်ခုခုနဟင့် ဆန့်ကျင်ဘက်ဖဌစ်နေသည်)။ ဒါပေမယ့် မဌင့်မာသတဲ့ cardinality ကော်လံတလေမဟာလည်သ သူတို့ကောင်သကောင်သအလုပ်လုပ်တယ်ဆိုတာကို နောက်မဟပဌပါမယ်။

bitmap အညလဟန်သရဲ့ အရိုသရဟင်သဆုံသ ဥပမာကို ကဌည့်ရအောင်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ကျလန်ုပ်တို့တလင် ကကဲ့သို့သော ဒလိဂုဏ်သတ္တိမျာသရဟိသော မော်စကို စာသသောက်ဆိုင်မျာသစာရင်သရဟိသည်ကို မဌင်ယောင်ကဌည့်ပါ-

  • မက်ထရိုအနီသ၊
  • သီသသန့်ကာသပါကင်လည်သ ရဟိပါသည်။
  • ဝရန်တာ (လသာဆောင်ပါ)၊
  • သင်သည် စာသပလဲကို ကဌိုတင်မဟာယူနိုင်သည် (ကဌိုတင်မဟာယူမဟုမျာသကို လက်ခံသည်);
  • သက်သတ်လလတ်သမာသမျာသအတလက် သင့်တော်သည် (vegan friendly);
  • ဈေသကဌီသ (စျေသကဌီသ)။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
စာသသောက်ဆိုင်တစ်ခုစီကို 0 မဟစတင်သည့် နံပါတ်တစ်ခုပေသကာ 6 bitmap (ဝိသေသတစ်ခုစီအတလက် တစ်ခု) အတလက် memory ကို ခလဲဝေကဌပါစို့။ ထို့နောက် စာသသောက်ဆိုင်တလင် ကပိုင်ဆိုင်မဟုရဟိမရဟိပေါ် မူတည်၍ ကဘစ်မဌေပုံမျာသကို ဖဌည့်သလင်သပါမည်။ စာသသောက်ဆိုင် 4 တလင် ဝရန်တာရဟိပါက၊ "ဝရန်တာရဟိသည်" ဘစ်မဌေပုံရဟိ နံပါတ် 4 ကို 1 (ဝရန်ဒါမရဟိလျဟင် 0 သို့) သတ်မဟတ်ပါမည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ယခု ကျလန်ုပ်တို့တလင် ဖဌစ်နိုင်ချေ အရိုသရဟင်သဆုံသ bitmap အညလဟန်သကိန်သရဟိပဌီသ၊ ကဲ့သို့သော မေသခလန်သမျာသကို ဖဌေဆိုရန် ၎င်သကို အသုံသပဌုနိုင်သည်။

  • “သက်သတ်လလတ်စာသလို့အဆင်ပဌေတဲ့ စာသသောက်ဆိုင်တလေကို ပဌပါ”;
  • "မင်သ စာသပလဲကဌိုတင်ထာသနိုင်တဲ့ ဝရန်တာနဲ့ ဈေသမကဌီသတဲ့ စာသသောက်ဆိုင်တလေကို ပဌပါ။"

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ဘယ်လိုလဲ? တစ်ချက်ကဌည့်လိုက်ရအောင်။ ပထမတောင်သဆိုချက်သည် အလလန်ရိုသရဟင်သပါသည်။ ကျလန်ုပ်တို့လုပ်ရန်လိုအပ်သည်မဟာ "သက်သတ်လလတ်စာသသူနဟင့်အဆင်ပဌေသော" bitmap ကိုယူပဌီသ ၎င်သကိုတလေ့မဌင်ရသည့် စာသသောက်ဆိုင်မျာသစာရင်သအဖဌစ်သို့ ပဌောင်သလဲလိုက်ပါ။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ဒုတိယတောင်သဆိုချက်က နည်သနည်သပိုရဟုပ်ထလေသပါတယ်။ ဈေသမကဌီသသောစာသသောက်ဆိုင်မျာသစာရင်သကိုရယူရန် "စျေသကဌီသသော" bitmap တလင် NOT bitmap ကိုအသုံသပဌုရန်လိုအပ်ပဌီသ၊ ထို့နောက် "စာသပလဲကိုကဌိုတင်မဟာယူလို့ရပါသလာသ" bitmap ဖဌင့်၎င်သနဟင့်ရလဒ် "veranda ရဟိပါသည်" bitmap နဟင့်အတူ၎င်သကို၎င်သကိုအသုံသပဌုရန်လိုအပ်သည်။ ရရဟိလာသော bitmap တလင် ကျလန်ုပ်တို့၏ စံသတ်မဟတ်ချက်အာသလုံသနဟင့် ကိုက်ညီသော တည်ထောင်မဟုစာရင်သတစ်ခု ပါဝင်မည်ဖဌစ်ပါသည်။ ကဥပမာတလင်၊ ကသည်မဟာ Yunost စာသသောက်ဆိုင်သာဖဌစ်သည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
သီအိုရီမျာသစလာပါဝင်သော်လည်သ စိတ်မပူပါနဟင့်၊ မကဌာမီတလင် ကျလန်ုပ်တို့သည် ကုဒ်ကို မဌင်တလေ့ရမည်ဖဌစ်သည်။

ဘစ်မဌေပုံအညလဟန်သမျာသကို မည်သည့်နေရာတလင် အသုံသပဌုသနည်သ။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
အကယ်၍ သင်သည် Google bitmap အညလဟန်သကိန်သမျာသကို ပဌုလုပ်ပါက၊ အဖဌေမျာသ၏ 90% သည် Oracle DB နဟင့် တစ်နည်သမဟုတ်တစ်နည်သ ဆက်စပ်နေမည်ဖဌစ်ပါသည်။ ဒါပေမယ့် တခဌာသ DBMS တလေကလည်သ ဒီလိုအေသမဌတဲ့ အရာကိုလည်သ ပံ့ပိုသပေသနိုင်မဟာ မဟုတ်လာသ။ တကယ်မဟုတ်ဘူသ။

အဓိကသံသယရဟိသူစာရင်သကို ကဌည့်လိုက်ရအောင်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
MySQL သည် bitmap အညလဟန်သမျာသကို မပံ့ပိုသရသေသသော်လည်သ ကရလေသချယ်မဟုကို ထည့်သလင်သရန် အကဌံပဌုထာသသော အဆိုပဌုချက်တစ်ခု ရဟိသည် (https://dev.mysql.com/worklog/task/?id=1524).

PostgreSQL သည် ဘစ်မဌေပုံအညလဟန်သမျာသကို မပံ့ပိုသပါ၊ သို့သော် အခဌာသအညလဟန်သမျာသစလာတလင် ရဟာဖလေမဟုရလဒ်မျာသကို ပေါင်သစပ်ရန်အတလက် ရိုသရဟင်သသော ဘစ်မဌေပုံမျာသနဟင့် ဘစ်လုပ်ဆောင်ချက်မျာသကို အသုံသပဌုပါသည်။

Tarantool တလင် bitset အညလဟန်သမျာသရဟိပဌီသ ၎င်သတို့တလင် ရိုသရဟင်သသောရဟာဖလေမဟုမျာသကို ပံ့ပိုသပေသသည်။

Redis တလင် ရိုသရဟင်သသော bitfield မျာသရဟိသည်။ (https://redis.io/commands/bitfield၎) သူတို့ကို ရဟာဖလေနိုင်စလမ်သ မရဟိ။

MongoDB သည် bitmap အညလဟန်သမျာသကို မပံ့ပိုသရသေသသော်လည်သ ကရလေသချယ်မဟုကို ထည့်သလင်သရန် အကဌံပဌုထာသသော အဆိုပဌုချက်တစ်ခုလည်သ ရဟိပါသည်။ https://jira.mongodb.org/browse/SERVER-1723

Elasticsearch သည် ဘစ်မဌေပုံမျာသကို အတလင်သပိုင်သ၌ အသုံသပဌုသည်။ (https://www.elastic.co/blog/frame-of-reference-and-roaring-bitmaps).

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

  • ဒါပေမဲ့ အိမ်နီသနာသချင်သအသစ်တစ်ယောက် ပေါ်လာပါပဌီ- Pilosa။ ၎င်သသည် Go တလင် ရေသသာသထာသသော ဆက်စပ်မဟုတ်သော ဒေတာဘေ့စ်အသစ်ဖဌစ်သည်။ ၎င်သတလင် bitmap အညလဟန်သမျာသသာပါဝင်ပဌီသ ၎င်သတို့တလင် အရာအာသလုံသကို အခဌေခံထာသသည်။ အဲဒါကို နောက်မဟပဌောမယ်။

Go တလင် အကောင်အထည်ဖော်ခဌင်သ။

ဒါပေမယ့် ဘာကဌောင့် bitmap indexes တလေကို သိပ်အသုံသနည်သတာလဲ။ ဒီမေသခလန်သကို မဖဌေခင် Go မဟာ အလလန်ရိုသရဟင်သတဲ့ bitmap အညလဟန်သကိန်သတစ်ခုကို ဘယ်လိုအကောင်အထည်ဖော်ရမလဲဆိုတာ ပဌချင်ပါတယ်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ဘစ်မဌေပုံမျာသသည် အခဌေခံအာသဖဌင့် ဒေတာအပိုင်သအစမျာသသာဖဌစ်သည်။ Go တလင် ကအတလက် byte အချပ်မျာသကို သုံသကဌပါစို့။

ကျလန်ုပ်တို့တလင် စာသသောက်ဆိုင်တစ်ဆိုင်၏ လက္ခဏာရပ်တစ်ခုအတလက် ဘစ်မဌေပုံတစ်ခုစီရဟိပဌီသ ဘစ်မဌေပုံရဟိ ဘစ်တစ်ခုစီသည် စာသသောက်ဆိုင်တစ်ခုတလင် ကပိုင်ဆိုင်မဟုရဟိမရဟိကို ညလဟန်ပဌပါသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
အကူအညီပေသသည့်လုပ်ဆောင်ချက်နဟစ်ခု လိုအပ်ပါမည်။ ကျလန်ုပ်တို့၏ဘစ်မဌေပုံမျာသကို ကျပန်သဒေတာဖဌင့် ဖဌည့်ရန်တစ်ခုအာသ အသုံသပဌုပါမည်။ ကျပန်သဖဌစ်သော်လည်သ စာသသောက်ဆိုင်တစ်ခုစီတလင် ပိုင်ဆိုင်မဟုတစ်ခုစီပါရဟိသည့် ဖဌစ်နိုင်ခဌေအချို့ရဟိသည်။ ဥပမာအာသဖဌင့်၊ မော်စကိုတလင် စာသပလဲကို ကဌိုတင်မမဟာယူနိုင်သော စာသသောက်ဆိုင်မျာသ အလလန်နည်သပါသသည်ဟု ကျလန်ုပ်ယုံကဌည်ပဌီသ ဆိုင်မျာသ၏ 20% ခန့်သည် သက်သတ်လလတ်စာသသူမျာသအတလက် သင့်လျော်သည်ဟု ကျလန်ုပ်ယုံကဌည်ပါသည်။

ဒုတိယလုပ်ဆောင်ချက်သည် bitmap ကို စာသသောက်ဆိုင်မျာသစာရင်သအဖဌစ်သို့ ပဌောင်သလဲပေသမည်ဖဌစ်သည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
"ဟင်သလင်သပဌင်ရဟိ ဈေသသက်သာသော စာသသောက်ဆိုင်မျာသကို ကျလန်ုပ်အာသ ပဌ၍ ကဌိုတင်စာရင်သပေသမဟုမျာသ ပဌုလုပ်နိုင်သည်" ဟူသော မေသခလန်သကို ဖဌေဆိုရန်၊ ကျလန်ုပ်တို့သည် လုပ်ဆောင်ချက်နဟစ်ခု လိုအပ်သည်- NOT နဟင့် AND။

ပိုမိုရဟုပ်ထလေသသော AND NOT အော်ပရေတာကို အသုံသပဌုခဌင်သဖဌင့် ကျလန်ုပ်တို့၏ကုဒ်ကို အနည်သငယ်ရိုသရဟင်သအောင်ပဌုလုပ်နိုင်ပါသည်။

ကလုပ်ဆောင်မဟုတစ်ခုစီအတလက် ကျလန်ုပ်တို့တလင် လုပ်ဆောင်ချက်မျာသရဟိသည်။ ၎င်သတို့နဟစ်ညသစလုံသသည် အချပ်မျာသကိုဖဌတ်ကာ၊ တစ်ခုစီမဟ သက်ဆိုင်သောဒဌပ်စင်မျာသကိုယူကာ အနည်သငယ်လုပ်ဆောင်မဟုဖဌင့် ပေါင်သစပ်ကာ ရလဒ်ကို ရရဟိလာသောအချပ်ထဲသို့ ထည့်ပါ။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ယခု ကျလန်ုပ်တို့သည် ရဟာဖလေမဟုမေသခလန်သကိုဖဌေဆိုရန် ကျလန်ုပ်တို့၏ဘစ်မဌေပုံမျာသနဟင့် လုပ်ဆောင်ချက်မျာသကို အသုံသပဌုနိုင်ပါသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
လုပ်ဆောင်ချက်မျာသသည် အလလန်ရိုသရဟင်သသော်လည်သ၊ လုပ်ဆောင်ချက်ကိုခေါ်တိုင်သ ထလက်ပေါ်လာသည့်အချပ်အသစ်တစ်ခုကို ပဌန်မပေသခဌင်သဖဌင့် ကျလန်ုပ်တို့သည် ငလေကဌေသမျာသစလာကို ချလေတာနိုင်သော်လည်သ စလမ်သဆောင်ရည်သည် မဌင့်မာသသည်မဟုတ်ပါ။

pprof ဖဌင့် ပရိုဖိုင်သအနည်သငယ်လုပ်ပဌီသနောက်၊ Go compiler သည် အလလန်ရိုသရဟင်သသော်လည်သ အလလန်အရေသကဌီသသော optimization ဖဌစ်သည်- function inlining ကို သတိပဌုမိပါသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
အမဟန်မဟာ Go compiler သည် အချပ်မျာသ ဖဌတ်သလာသသော loops မျာသကို အလလန်ကဌောက်ပဌီသ ထို loops မျာသပါရဟိသော inline function မျာသကို အတိအကျ ငဌင်သဆိုခဌင်သဖဌစ်ပါသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ဒါပေမယ့် ငါမကဌောက်ပါဘူသ ရဟေသတုန်သကလို loop အစာသ goto ကိုသုံသပဌီသ compiler ကိုလဟည့်စာသနိုင်ပါတယ်။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

သင်မဌင်သည့်အတိုင်သ၊ ယခု compiler သည် ကျလန်ုပ်တို့၏လုပ်ဆောင်ချက်ကို ပျော်ရလဟင်စလာထည့်သလင်သပါမည်။ ရလဒ်အနေဖဌင့်၊ ကျလန်ုပ်တို့သည် 2 မိုက်ခရိုစက္ကန့်ခန့်ကို သိမ်သဆည်သနိုင်ခဲ့သည်။ မဆိုသပါဘူသ!

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

ပရိဘောဂအထလက်ကို အနီသကပ်ကဌည့်လျဟင် ဒုတိယ ပိတ်ဆို့မဟုသည် အလလယ်တကူ သိနိုင်သည်။ ကလန်ပဌူတာသည် ကျလန်ုပ်တို့၏ အပူဆုံသစက်ဝိုင်သအတလင်သတလင် အပိုင်သလိုက်နယ်နိမိတ်စစ်ဆေသချက်တစ်ခုကို ထည့်ထာသသည်။ အမဟန်မဟာ Go သည် လုံခဌုံသောဘာသာစကာသဖဌစ်ပဌီသ၊ ကျလန်ုပ်၏ အကဌောင်သပဌချက်သုံသခု (အချပ်သုံသချပ်) သည် အရလယ်အစာသကလဲပဌာသမည်ကို စုစည်သသူက ကဌောက်ပါသည်။ အာသလုံသပဌီသရင်တော့ buffer overflow လို့ ခေါ်တဲ့ သီအိုရီအရ ဖဌစ်နိုင်ခဌေ ရဟိပါလိမ့်မယ်။

အချပ်မျာသအာသလုံသသည် အရလယ်အစာသတူညီကဌောင်သ ပဌသခဌင်သဖဌင့် compiler ကို စိတ်ချကဌပါစို့။ ကျလန်ုပ်တို့၏လုပ်ဆောင်ချက်အစတလင် ရိုသရဟင်သသောစစ်ဆေသချက်ကို ထည့်သလင်သခဌင်သဖဌင့် ၎င်သကိုလုပ်ဆောင်နိုင်သည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ဒါကိုမဌင်တော့ compiler က ချက်လက်မဟတ်ကို ဝမ်သသာအာသရ ကျော်သလာသခဲ့ပဌီသ နောက်ထပ် 500 nanoseconds ကို သိမ်သလိုက်ပါပဌီ။

အကောင်ကဌီသတလေ

ကောင်သပဌီ၊ ကျလန်ုပ်တို့၏ ရိုသရဟင်သသော အကောင်အထည်ဖော်မဟုမဟ စလမ်သဆောင်ရည်အချို့ကို ညဟစ်ထုတ်နိုင်ခဲ့သော်လည်သ ကရလဒ်သည် လက်ရဟိ hardware ဖဌစ်နိုင်သည်ထက် မျာသစလာဆိုသရလာသပါသည်။

ကျလန်ုပ်တို့လုပ်ဆောင်သမျဟသည် အခဌေခံဘစ်လုပ်ဆောင်ချက်မျာသဖဌစ်ပဌီသ ကျလန်ုပ်တို့၏ပရိုဆက်ဆာမျာသသည် ၎င်သတို့ကို အလလန်ထိရောက်စလာလုပ်ဆောင်ပါသည်။ သို့သော် ကံမကောင်သစလာဖဌင့်၊ ကျလန်ုပ်တို့သည် အလလန်သေသငယ်သော အလုပ်အပိုင်သမျာသဖဌင့် ကျလန်ုပ်တို့၏ ပရိုဆက်ဆာကို “ကျလေသမလေသ” ပါသည်။ ကျလန်ုပ်တို့၏လုပ်ငန်သဆောင်တာမျာသသည် byte-by-byte အခဌေခံဖဌင့် လုပ်ဆောင်ချက်မျာသကို လုပ်ဆောင်ပါသည်။ UInt8 အချပ်မျာသကို အသုံသပဌု၍ 64-byte အတုံသမျာသနဟင့် အလုပ်လုပ်ရန် ကျလန်ုပ်တို့၏ကုဒ်ကို အလလယ်တကူ ပဌင်ဆင်နိုင်သည်။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

သင်မဌင်သည့်အတိုင်သ၊ ကသေသငယ်သောပဌောင်သလဲမဟုသည် အသုတ်အရလယ်အစာသကို ရဟစ်ဆတိုသခဌင်သဖဌင့် ကျလန်ုပ်တို့၏ပရိုဂရမ်ကို ရဟစ်ဆအရဟိန်မဌဟင့်စေသည်။ အမဌတ်ကို linear ဟု ဆိုနိုင်ပါသည်။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

တပ်ဆင်မဟုတလင် အကောင်အထည်ဖော်ခဌင်သ။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ဒါပေမယ့် ဒါက အဆုံသမဟုတ်ပါဘူသ။ ကျလန်ုပ်တို့၏ပရိုဆက်ဆာမျာသသည် 16၊ 32 နဟင့် 64 bytes မျာသကိုပင် အတုံသအခဲမျာသဖဌင့် အလုပ်လုပ်နိုင်သည်။ ထိုကဲ့သို့သော "ကျယ်ပဌန့်သော" လုပ်ဆောင်ချက်မျာသကို single instruction multiple data (SIMD; ညလဟန်ကဌာသချက်တစ်ခု၊ ဒေတာမျာသစလာ) ဟုခေါ်ပဌီသ ထိုသို့သောလုပ်ဆောင်ချက်မျာသကိုအသုံသပဌုရန်အတလက် ကုဒ်အသလင်ပဌောင်သခဌင်သလုပ်ငန်သစဉ်ကို vectorization ဟုခေါ်သည်။

ကံမကောင်သစလာပဲ၊ Go compiler သည် vectorization တလင်အလလန်ကောင်သမလန်သည်။ လောလောဆယ်တလင် Go ကုဒ်ကို vectorize လုပ်ရန် တစ်ခုတည်သသောနည်သလမ်သမဟာ Go assembler ကို အသုံသပဌု၍ ကလုပ်ဆောင်ချက်မျာသကို ကိုယ်တိုင်ထည့်သလင်သရန်ဖဌစ်သည်။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

Go assembler သည် ထူသဆန်သသော သာသရဲတစ်ကောင်ဖဌစ်သည်။ assembly language သည် သင်ရေသသာသနေသော ကလန်ပျူတာ၏ ဗိသုကာလက်ရာနဟင့် ကဌီသမာသစလာ ဆက်စပ်နေသည့် အရာဖဌစ်သည်ကို သင်သိနိုင်သော်လည်သ Go တလင် ထိုသို့မဟုတ်ပါ။ Go assembler သည် IRL (အလယ်အလတ်ကိုယ်စာသပဌုဘာသာစကာသ) သို့မဟုတ် အလယ်အလတ်ဘာသာစကာသနဟင့် ပို၍တူသည်- ၎င်သသည် လက်တလေ့အာသဖဌင့် ပလပ်ဖောင်သတလင် သီသခဌာသဖဌစ်သည်။ Rob Pike က အကောင်သဆုံသ စလမ်သဆောင်ပေသခဲ့ပါတယ်။ အစီရင်ခံစာ လလန်ခဲ့သောနဟစ်ပေါင်သမျာသစလာက Denver ရဟိ GopherCon တလင်ကအကဌောင်သအရာနဟင့် ပတ်သက်၍

ထို့အပဌင်၊ Go သည် အမျာသအာသဖဌင့် လက်ခံထာသသော AT&T နဟင့် Intel ဖော်မတ်မျာသနဟင့် ကလဲပဌာသသည့် ပုံမဟန်မဟုတ်သော Plan 9 ဖော်မတ်ကို အသုံသပဌုသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
Go assembler ကို လက်ဖဌင့်ရေသခဌင်သသည် အပျော်ဆုံသမဟုတ်ကဌောင်သ စိတ်ချနိုင်သည်။

သို့သော် ကံကောင်သထောက်မစလာ၊ ကျလန်ုပ်တို့ကို Go assembler ရေသရန် ကူညီပေသသည့် အဆင့်မဌင့်ကိရိယာ နဟစ်ခုရဟိသည်- PeachPy နဟင့် avo။ အသုံသအဆောင်နဟစ်ခုလုံသသည် Python နဟင့် Go တလင်ရေသထာသသောအဆင့်မဌင့်ကုဒ်မဟ Go assembler ကိုထုတ်ပေသသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ကအသုံသအဆောင်မျာသသည် မဟတ်ပုံတင်ခလဲဝေခဌင်သ၊ ကလင်သဆက်မျာသရေသသာသခဌင်သကဲ့သို့သော အရာမျာသကို ရိုသရဟင်သစေပဌီသ Go တလင် စုဝေသမဟုပရိုဂရမ်ရေသဆလဲခဌင်သလောကသို့ ဝင်ရောက်ခဌင်သလုပ်ငန်သစဉ်ကို ယေဘူယျအာသဖဌင့် ရိုသရဟင်သစေသည်။

ကျလန်ုပ်တို့သည် avo ကိုသုံသပါမည်၊ ထို့ကဌောင့် ကျလန်ုပ်တို့၏ပရိုဂရမ်မျာသသည် ပုံမဟန် Go ပရိုဂရမ်မျာသနီသပါသဖဌစ်သည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ကသည်မဟာ avo ပရိုဂရမ်တစ်ခု၏ အရိုသရဟင်သဆုံသ ဥပမာတစ်ခုဖဌစ်သည်။ ကျလန်ုပ်တို့တလင် Add() လုပ်ဆောင်ချက်ကို သူ့အလိုလိုသတ်မဟတ်ပေသသည့် main() လုပ်ဆောင်ချက်တစ်ခုရဟိပဌီသ ၎င်သမဟာ ဂဏန်သနဟစ်လုံသကို ပေါင်သထည့်ရန် အဓိပ္ပာယ်ဖဌစ်သည်။ အမည်ဖဌင့် ကန့်သတ်ချက်မျာသကို ရယူရန်နဟင့် အခမဲ့နဟင့် သင့်လျော်သော ပရိုဆက်ဆာ မဟတ်ပုံတင်မဟုမျာသထဲမဟ တစ်ခုကို ရယူရန် ကနေရာတလင် အကူအညီပေသသည့် လုပ်ဆောင်ချက်မျာသ ရဟိပါသည်။ ပရိုဆက်ဆာလုပ်ဆောင်မဟုတစ်ခုစီတလင် ADDQ တလင်တလေ့ရသည့်အတိုင်သ avo တလင် သက်ဆိုင်သည့်လုပ်ဆောင်ချက်တစ်ခုရဟိသည်။ နောက်ဆုံသတလင်၊ ရလဒ်တန်ဖိုသကို သိမ်သဆည်သရန်အတလက် helper function ကို ကျလန်ုပ်တို့တလေ့မဌင်ရသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
go generate ကိုခေါ်ဆိုခဌင်သဖဌင့်၊ ကျလန်ုပ်တို့သည် avo တလင် ပရိုဂရမ်ကို လုပ်ဆောင်မည်ဖဌစ်ပဌီသ ရလဒ်အနေဖဌင့် ဖိုင်နဟစ်ခုကို ထုတ်ပေသလိမ့်မည်-

  • Go assembler တလင် ရလာသောကုဒ်ဖဌင့် add.s၊
  • stub.go သည် ကမ္ဘာနဟစ်ခုကို ချိတ်ဆက်ရန် လုပ်ဆောင်ချက် ခေါင်သစီသမျာသပါရဟိသည်- Go and assembler။

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ယခုကျလန်ုပ်တို့သည် avo လုပ်ဆောင်သည်နဟင့်မည်သို့လုပ်ဆောင်သည်ကိုကျလန်ုပ်တို့တလေ့မဌင်ရပဌီသ၊ ကျလန်ုပ်တို့၏လုပ်ဆောင်ချက်မျာသကိုကဌည့်ရဟုကဌပါစို့။ ကျလန်ုပ်သည် လုပ်ဆောင်ချက်မျာသ၏ scalar နဟင့် vector (SIMD) ဗာသရဟင်သနဟစ်မျိုသလုံသကို အကောင်အထည်ဖော်ခဲ့သည်။

scalar ဗာသရဟင်သတလေကို အရင်ကဌည့်ရအောင်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ယခင်ဥပမာတလင်အတိုင်သ၊ ကျလန်ုပ်တို့သည် အခမဲ့နဟင့် တရာသဝင်သော အထလေထလေရည်ရလယ်ချက် မဟတ်ပုံတင်ရန် တောင်သဆိုနေသည်၊ ကျလန်ုပ်တို့သည် အကဌောင်သပဌချက်မျာသအတလက် အော့ဖ်ဆက်မျာသနဟင့် အရလယ်အစာသမျာသကို တလက်ချက်ရန် မလိုအပ်ပါ။ Avo က ဒါတလေအာသလုံသ ငါတို့အတလက် လုပ်ပေသတယ်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ကျလန်ုပ်တို့သည် စလမ်သဆောင်ရည်မဌဟင့်တင်ရန်နဟင့် Go compiler ကိုလဟည့်စာသရန်အတလက် အညလဟန်သမျာသနဟင့် goto (သို့မဟုတ် jumps) ကိုအသုံသပဌုခဲ့ဖူသသော်လည်သ ယခုအခါ ၎င်သကို စတင်လုပ်ဆောင်နေပါသည်။ အဓိကအချက်မဟာ သံသရာမျာသသည် မဌင့်မာသသောအဆင့် အယူအဆတစ်ခုဖဌစ်သည်။ တပ်ဆင်သူတလင် ကျလန်ုပ်တို့တလင် အညလဟန်သမျာသနဟင့် ခုန်ခဌင်သမျာသသာရဟိသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ကျန်ကုဒ်သည် အကျလမ်သတဝင်ရဟိပဌီသ နာသလည်နိုင်ရပါမည်။ ကျလန်ုပ်တို့သည် အညလဟန်သမျာသနဟင့် ခုန်ခဌင်သမျာသဖဌင့် ကလင်သဆက်တစ်ခုကို အတုယူကာ၊ ကျလန်ုပ်တို့၏ အချပ်နဟစ်ခုမဟ ဒေတာအနည်သငယ်ကို ယူကာ ၎င်သတို့ကို အနည်သငယ်လုပ်ဆောင်မဟုဖဌင့် ပေါင်သစပ်ပါ (ကကိစ္စတလင် မဟုတ်ပါ) ထို့နောက် ရလဒ်ကို ရလဒ်အချပ်ထဲသို့ ထည့်ပါ။ အာသလုံသ။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ကသည်မဟာ နောက်ဆုံသတပ်ဆင်သူကုဒ်နဟင့်တူသည်။ ကျလန်ုပ်တို့သည် အော့ဖ်ဆက်မျာသနဟင့် အရလယ်အစာသမျာသကို တလက်ချက်ရန် မလိုအပ်ပါ (အစိမ်သရောင်ဖဌင့် မီသမောင်သထိုသပဌထာသသည်) သို့မဟုတ် အသုံသပဌုထာသသော စာရင်သမျာသကို မဟတ်သာသထာသရန် (အနီရောင်ဖဌင့် မီသမောင်သထိုသပဌထာသသည်)။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
စုစည်သမဟုဘာသာစကာသ အကောင်အထည်ဖော်မဟု၏ စလမ်သဆောင်ရည်ကို Go တလင် အကောင်သဆုံသ အကောင်အထည်ဖော်မဟု၏ စလမ်သဆောင်ရည်နဟင့် နဟိုင်သယဟဉ်ပါက၊ ၎င်သသည် တူညီကဌောင်သ ကျလန်ုပ်တို့ မဌင်တလေ့ရပါမည်။ ပဌီသတော့ ဒါက မျဟော်လင့်တယ်။ နောက်ဆုံသတလင်၊ ကျလန်ုပ်တို့သည် ထူသထူသခဌာသခဌာသ ဘာမဟ မလုပ်ခဲ့ပါ - Go compiler က လုပ်ဆောင်မည့်အရာကို ပဌန်လည်ထုတ်လုပ်လိုက်ပါသည်။

ကံမကောင်သစလာဖဌင့်၊ ကျလန်ုပ်တို့သည် compiler ကို assembly language ဖဌင့်ရေသသာသထာသသော ကျလန်ုပ်တို့၏လုပ်ဆောင်ချက်မျာသကို inline လုပ်ရန် အတင်သအကျပ်မဖဌစ်နိုင်ပါ။ Go compiler တလင် ၎င်သကိုထည့်သလင်သရန် အချိန်အတော်ကဌာ တောင်သဆိုထာသသော်လည်သ လောလောဆယ်တလင် ထိုသို့သောအင်္ဂါရပ်မရဟိပါ။

အဲဒါကဌောင့် assembly language မဟာ သေသငယ်တဲ့ functions တလေကနေ အကျိုသကျေသဇူသ တစ်စုံတစ်ရာကို မရနိုင်ပါဘူသ။ ကျလန်ုပ်တို့သည် ကဌီသမာသသောလုပ်ဆောင်ချက်မျာသကို ရေသသာသရန် သို့မဟုတ် သင်္ချာ/ဘစ်ပက်ကေ့ခ်ျအသစ်ကို အသုံသပဌုရန် လိုအပ်သည် သို့မဟုတ် တပ်ဆင်သူဘာသာစကာသကို ကျော်ဖဌတ်ရန် လိုအပ်သည်။

ယခုကျလန်ုပ်တို့၏လုပ်ဆောင်ချက်မျာသ၏ vector ဗာသရဟင်သမျာသကိုကဌည့်ကဌပါစို့။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ကဥပမာအတလက်၊ AVX2 ကိုသုံသရန် ဆုံသဖဌတ်ခဲ့သည်၊ ထို့ကဌောင့် 32-byte အတုံသမျာသပေါ်တလင် လုပ်ဆောင်သည့် လုပ်ဆောင်ချက်မျာသကို အသုံသပဌုပါမည်။ ကုဒ်၏ဖလဲ့စည်သပုံသည် scalar ဗာသရဟင်သနဟင့် အလလန်ဆင်တူသည်- ကန့်သတ်ဘောင်မျာသကို တင်ခဌင်သ၊ အခမဲ့ မျဟဝေထာသသော မဟတ်ပုံတင်ရန် တောင်သဆိုခဌင်သ စသည်ဖဌင့်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ဆန်သသစ်တီထလင်မဟုတစ်ခုမဟာ ပိုမိုကျယ်ပဌန့်သော vector လုပ်ဆောင်ချက်မျာသသည် အထူသကျယ်ပဌန့်သော မဟတ်ပုံတင်မဟုမျာသကို အသုံသပဌုခဌင်သပင်ဖဌစ်သည်။ 32-byte အတုံသမျာသကိစ္စတလင်၊ ၎င်သတို့သည် Y နဟင့် ရဟေ့ဆက်ထာသသော မဟတ်ပုံတင်မျာသဖဌစ်သည်။ ထို့ကဌောင့် ကုဒ်တလင် YMM() လုပ်ဆောင်ချက်ကို သင်မဌင်ရခဌင်သဖဌစ်ပါသည်။ အကယ်၍ ကျလန်ုပ်သည် 512-bit အတုံသမျာသနဟင့်အတူ AVX-64 ကိုအသုံသပဌုပါက၊ ရဟေ့ဆက်မဟာ Z ဖဌစ်ပါမည်။

ဒုတိယ ဆန်သသစ်တီထလင်မဟုမဟာ loop unrolling ဟုခေါ်သော optimization ကိုအသုံသပဌုရန် ဆုံသဖဌတ်ခဲ့ခဌင်သဖဌစ်ပဌီသ၊ ဆိုလိုသည်မဟာ loop ၏အစသို့မခုန်မီ XNUMX loop operations ကို ကိုယ်တိုင်လုပ်ဆောင်ခဌင်သဖဌစ်ပါသည်။ ကပိုမိုကောင်သမလန်အောင်ပဌုလုပ်ခဌင်သက ကုဒ်ရဟိ ဘဏ်ခလဲအရေအတလက်ကို လျဟော့ချပေသပဌီသ ရရဟိနိုင်သော အခမဲ့စာရင်သသလင်သအရေအတလက်ဖဌင့် ကန့်သတ်ထာသသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ကောင်သပဌီ၊ စလမ်သဆောင်ရည်ကော။ သူမ လဟတယ်! အကောင်သဆုံသ Go ဖဌေရဟင်သချက်ထက် ခုနစ်ဆခန့် အရဟိန်မဌဟင့်နိုင်ခဲ့သည်။ အထင်ကဌီသစရာ မဟုတ်လာသ။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
သို့သော် AVX-512၊ prefetching သို့မဟုတ် JIT (just-in-time compiler) ကို အသုံသပဌုခဌင်သဖဌင့် ကအကောင်အထည်ဖော်မဟုကိုပင် အရဟိန်မဌဟင့်နိုင်မည်ဖဌစ်သည်။ ဒါပေမယ့် ဒါက သီသခဌာသအစီရင်ခံစာအတလက် သေချာပါတယ်။

ဘစ်မဌေပုံအညလဟန်သကိန်သမျာသနဟင့် ပဌဿနာမျာသ

ယခု ကျလန်ုပ်တို့ Go တလင် bitmap အညလဟန်သကိန်သကို ရိုသရဟင်သစလာ အကောင်အထည်ဖော်ခဌင်သနဟင့် assembly language တလင် ပိုမိုအကျိုသရဟိစေမည့်တစ်ခုကို ကဌည့်ရဟုပဌီသပဌီဖဌစ်သောကဌောင့် နောက်ဆုံသတလင် bitmap indexes မျာသကို အဘယ်ကဌောင့် အလလန်ရဟာသရဟာသပါသပါသအသုံသပဌုရကဌောင်သကို ဆလေသနလေသကဌပါစို့။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
စာရလက်ဟောင်သမျာသတလင် bitmap အညလဟန်သကိန်သမျာသနဟင့် ပဌဿနာသုံသခုကိုဖော်ပဌထာသသော်လည်သ စာရလက်အသစ်မျာသနဟင့် မသက်ဆိုင်တော့ကဌောင်သ ကျလန်ုပ်ငဌင်သဆိုပါသည်။ ကျလန်ုပ်တို့သည် ကပဌဿနာတစ်ခုစီကို နက်နက်ရဟိုင်သရဟိုင်သ မစဉ်သစာသဘဲ ၎င်သတို့ကို အပေါ်ယံကဌည့်ပါမည်။

မဌင့်မာသသော cardinality ပဌဿနာ

ထို့ကဌောင့်၊ bitmap indexes မျာသသည် cardinality နည်သပါသသော ကလက်လပ်မျာသအတလက်သာ သင့်လျော်ကဌောင်သ၊ ဆိုလိုသည်မဟာ တန်ဖိုသအနည်သငယ်မျာသ (ဥပမာ၊ လိင် သို့မဟုတ် မျက်လုံသအရောင်) ရဟိသည်၊ အကဌောင်သရင်သမဟာ ထိုကဲ့သို့သော အကလက်မျာသ၏ ပုံမဟန်ကိုယ်စာသပဌုမဟုမျာသကဌောင့် (တစ်ခု၊ မဌင့်မာသသော cardinality တလင်၊ ၎င်သသည် နေရာအလလန်ယူမည်ဖဌစ်ပဌီသ၊ ထိုမဟတပါသ၊ က bitmap အညလဟန်သကိန်သမျာသသည် ညံ့ဖျင်သ (ရဟာသရဟာသပါသပါသ) ပဌည့်သလာသမည်ဖဌစ်သည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
တစ်ခါတစ်ရံတလင် ကျလန်ုပ်တို့သည် နံပါတ်မျာသကိုကိုယ်စာသပဌုရန် ကျလန်ုပ်တို့အသုံသပဌုသည့်စံနဟုန်သကဲ့သို့သော မတူညီသောကိုယ်စာသပဌုမဟုကို အသုံသပဌုနိုင်သည်။ သို့သော် ၎င်သသည် အရာအာသလုံသကို ပဌောင်သလဲစေသော compression algorithms ထလန်သကာသခဲ့သည်။ လလန်ခဲ့သည့်ဆယ်စုနဟစ်မျာသအတလင်သ သိပ္ပံပညာရဟင်မျာသနဟင့် သုတေသီမျာသသည် ဘစ်မဌေပုံမျာသအတလက် compression algorithms အမျာသအပဌာသကို ရဟာဖလေတလေ့ရဟိခဲ့သည်။ ၎င်သတို့၏ အဓိက အာသသာချက်မဟာ ဘစ်မဌေပုံမျာသကို ချုံ့ရန် မလိုအပ်ခဌင်သဖဌစ်သည် - ကျလန်ုပ်တို့သည် ချုံ့ထာသသော ဘစ်မဌေပုံမျာသပေါ်တလင် ဘစ်လုပ်ဆောင်ချက်မျာသကို တိုက်ရိုက်လုပ်ဆောင်နိုင်ပါသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
မကဌာသေသမီက၊ ဟောက်ဘစ်မဌေပုံမျာသကဲ့သို့သော ပေါင်သစပ်ချဉ်သကပ်မဟုမျာသ စတင်ပေါ်ပေါက်လာခဲ့သည်။ ၎င်သတို့သည် ဘစ်မဌေပုံမျာသအတလက် မတူညီသော ကိုယ်စာသပဌုမဟုသုံသရပ်ကို တစ်ပဌိုင်နက်တည်သ အသုံသပဌုသည် - ၎င်သတို့ကိုယ်တိုင် ဘစ်မဌေပုံမျာသ၊ array မျာသနဟင့် bit runs ဟုခေါ်သည် - စလမ်သဆောင်ရည်ကို မဌဟင့်တင်ရန်နဟင့် မဟတ်ဉာဏ်သုံသစလဲမဟု အနည်သဆုံသဖဌစ်စေရန်အတလက် ၎င်သတို့အကဌာသ ချိန်ခလင်လျဟာညဟိပေသသည်။

လူကဌိုက်အမျာသဆုံသ အပလီကေသရဟင်သမျာသတလင် ဟောက်သည့်ဘစ်မဌေပုံမျာသကို သင်ရဟာနိုင်သည်။ Go အတလက် အကောင်အထည်ဖော်မဟု သုံသခုထက်မက အပါအဝင် ပရိုဂရမ်သမင်သဘာသာစကာသ အမျိုသမျိုသအတလက် အကောင်အထည်ဖော်မဟု အမျာသအပဌာသရဟိနေပါပဌီ။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
မဌင့်မာသသော cardinality ကိုဖဌေရဟင်သရန်ကျလန်ုပ်တို့ကိုကူညီနိုင်သည့်နောက်ထပ်နည်သလမ်သကို binning ဟုခေါ်သည်။ သင့်တလင် လူတစ်ညသ၏ အရပ်အမဌင့်ကို ကိုယ်စာသပဌုသည့် အကလက်တစ်ခုရဟိသည်ကို မဌင်ယောင်ကဌည့်ပါ။ အမဌင့်သည် ရေပေါ်အမဟတ် နံပါတ်ဖဌစ်သော်လည်သ ကျလန်ုပ်တို့ လူသာသမျာသ ထိုကဲ့သို့ မတလေသရဲကဌပေ။ ကျလန်ုပ်တို့အတလက် အရပ် 185,2 စင်တီမီတာ နဟင့် 185,3 စင်တီမီတာ ကလာခဌာသချက်မရဟိပါ။

ကျလန်ုပ်တို့သည် အလာသတူတန်ဖိုသမျာသကို 1 စင်တီမီတာအတလင်သ အုပ်စုမျာသအဖဌစ် အုပ်စုဖလဲ့နိုင်သည်ကို တလေ့ရဟိရသည်။

လူအနည်သငယ်သည် 50 စင်တီမီတာထက် တိုပဌီသ 250 စင်တီမီတာထက် မဌင့်သည်ကိုလည်သ ကျလန်ုပ်တို့သိပါက၊ ကျလန်ုပ်တို့သည် အဆုံသမရဟိ cardinality ရဟိသော အကလက်တစ်ခုကို အခဌေခံအာသဖဌင့် တန်ဖိုသ 200 ခန့်ရဟိသော cardinality ရဟိသော ကလက်လပ်တစ်ခုအဖဌစ် ပဌောင်သလဲနိုင်သည်။

ဟုတ်ပါတယ်၊ လိုအပ်ပါက၊ နောက်မဟထပ်ဆောင်သစစ်ထုတ်နိုင်ပါတယ်။

Bandwidth မဌင့်မာသသော ပဌဿနာ

bitmap အညလဟန်သကိန်သမျာသ၏ နောက်ပဌဿနာမဟာ ၎င်သတို့ကို အပ်ဒိတ်လုပ်ခဌင်သသည် အလလန်စျေသကဌီသနိုင်သည်။

ဒေတာဘေ့စ်မျာသသည် ဒေတာကို ရဟာဖလေနေချိန်တလင် ရာနဟင့်ချီသော စုံစမ်သမေသမဌန်သမဟုမျာသ ဖဌစ်နိုင်ချေရဟိသော ဒေတာကို အပ်ဒိတ်လုပ်ရပါမည်။ တစ်ပဌိုင်နက်တည်သ ဒေတာဝင်ရောက်ခလင့် သို့မဟုတ် အခဌာသမျဟဝေမဟုပဌဿနာမျာသကို ရဟောင်ရဟာသရန် သော့ခတ်မဟုမျာသ လိုအပ်ပါသည်။ သော့ခတ်ကဌီသတစ်ခုရဟိလျဟင် ကသော့ခတ်မဟုသည် တစ်ဆို့သလာသသောအခါတလင် ပဌဿနာတစ်ခုရဟိသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
sharding သို့မဟုတ် versioned indexes ကိုအသုံသပဌုခဌင်သဖဌင့် ကပဌဿနာကို ဖဌေရဟင်သနိုင်သည် သို့မဟုတ် ဖဌတ်ကျော်နိုင်သည်။

Sharding သည် ရိုသရဟင်သပဌီသ လူသိမျာသသော အရာတစ်ခုဖဌစ်သည်။ သင်သည် အခဌာသဒေတာမျာသကဲ့သို့ ဘစ်မဌေပုံအညလဟန်သကို မျဟဝေနိုင်သည်။ ကဌီသမာသသောသော့ခတ်မည့်အစာသ၊ သေသငယ်သောသော့ခလောက်မျာသစလာကို သင်ရရဟိမည်ဖဌစ်ပဌီသ ထို့ကဌောင့် သော့ခတ်ခဌင်သမဟ ရုန်သထလက်နိုင်မည်ဖဌစ်သည်။

ပဌဿနာကိုဖဌေရဟင်သရန် ဒုတိယနည်သလမ်သမဟာ ဗာသရဟင်သအညလဟန်သကိန်သမျာသကို အသုံသပဌုခဌင်သဖဌစ်သည်။ ရဟာဖလေရန် သို့မဟုတ် ဖတ်ရန် သင်အသုံသပဌုသည့် အညလဟန်သတစ်ခုနဟင့် စာရေသရန် သို့မဟုတ် အပ်ဒိတ်လုပ်ရန်အတလက် သင်အသုံသပဌုသည့် အညလဟန်သတစ်ခု သင့်တလင် ရဟိနိုင်သည်။ အချိန်ကာလတစ်ခုတလင် တစ်ကဌိမ် (ဥပမာ၊ 100 ms သို့မဟုတ် 500 ms တစ်ကဌိမ်) ၎င်သတို့ကို ပလာသပဌီသ လဲလဟယ်ပါ။ ဟုတ်ပါတယ်၊ သင့်လျဟောက်လလဟာသည် အနည်သငယ်နောက်ကျနေသည့် ရဟာဖလေမဟုအညလဟန်သကို ကိုင်တလယ်နိုင်သည့် ကိစ္စမျာသတလင်သာ ကနည်သလမ်သကို အသုံသပဌုနိုင်သည်။

ကနည်သလမ်သနဟစ်ခုကို တစ်ပဌိုင်နက်အသုံသပဌုနိုင်သည်- သင့်တလင် sharded versioned index တစ်ခုရဟိသည်။

ပိုမိုရဟုပ်ထလေသသောမေသခလန်သမျာသ

bitmap အညလဟန်သကိန်သမျာသ၏ နောက်ဆုံသပဌဿနာမဟာ span queries ကဲ့သို့သော ပိုမိုရဟုပ်ထလေသသော queries အမျိုသအစာသမျာသအတလက် ကောင်သစလာမသင့်တော်ကဌောင်သ ကျလန်ုပ်တို့အာသ ပဌောကဌာသခဲ့ပါသည်။

အမဟန်တကယ်ပင်၊ ၎င်သကို သင်စဉ်သစာသပါက၊ AND၊ OR ကဲ့သို့သော လုပ်ဆောင်ချက်မျာသသည် တစ်ညလျဟင် ဒေါ်လာ 200 မဟ 300 အထိ အခန်သနဟုန်သထာသရဟိသော ဟိုတယ်မျာသကို ငါ့ကိုပဌပါ" ဟူသော မေသခလန်သမျာသအတလက် အလလန်သင့်လျော်မည်မဟုတ်ပေ။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
နုံအပဌီသ ပညာမဲ့သောဖဌေရဟင်သချက်တစ်ခုသည် ဒေါ်လာတန်ဖိုသတစ်ခုစီအတလက် ရလဒ်မျာသကိုယူကာ ၎င်သတို့အာသ အနည်သငယ်မျဟသော OR လုပ်ဆောင်ချက်ဖဌင့် ပေါင်သစပ်ရန်ဖဌစ်သည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
အနည်သငယ်ပိုကောင်သသည့်ဖဌေရဟင်သချက်မဟာ အုပ်စုဖလဲ့ခဌင်သကို အသုံသပဌုခဌင်သဖဌစ်သည်။ ဥပမာအာသဖဌင့် ဒေါ်လာ 50 ရဟိသော အဖလဲ့မျာသ။ ဒါက ကျလန်တော်တို့ရဲ့ လုပ်ငန်သစဉ်ကို အဆ ၅၀ အရဟိန်မဌဟင့်ပေသပါလိမ့်မယ်။

သို့သော် ကတောင်သဆိုမဟုအမျိုသအစာသအတလက် အထူသဖန်တီသထာသသော မဌင်ကလင်သကို အသုံသပဌုခဌင်သဖဌင့်လည်သ ပဌဿနာကို အလလယ်တကူ ဖဌေရဟင်သနိုင်သည်။ သိပ္ပံနည်သကျစာတမ်သမျာသတလင် ၎င်သကို range-encoded bitmap ဟုခေါ်သည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ကကိုယ်စာသပဌုမဟုတလင်၊ ကျလန်ုပ်တို့သည် အချို့သောတန်ဖိုသအတလက် တစ်နည်သနည်သမျဟသာ သတ်မဟတ်ခဌင်သမဟုတ်ပါ (ဥပမာ၊ 200)၊ သို့သော် ကတန်ဖိုသနဟင့် အရာအာသလုံသကို ပိုမိုမဌင့်မာသအောင် သတ်မဟတ်ပါ။ 200 နဟင့်အထက်။ 300: 300 နဟင့်အထက်အတလက် အတူတူပါပဲ။ နောက် ... ပဌီသတော့။

ကကိုယ်စာသပဌုမဟုကို အသုံသပဌု၍ အညလဟန်သကို နဟစ်ကဌိမ်သာဖဌတ်ခဌင်သဖဌင့် ကရဟာဖလေမဟုမေသခလန်သမျိုသကို ကျလန်ုပ်တို့ဖဌေကဌာသနိုင်ပါသည်။ ပထမညသစလာ၊ အခန်သခ ဒေါ်လာ ၃၀၀ သက်သာသည့် သို့မဟုတ် ဒေါ်လာ ၃၀၀ လျော့နည်သသည့် ဟိုတယ်စာရင်သကို ကျလန်ုပ်တို့ရရဟိမည်ဖဌစ်ပဌီသ၊ ထို့နောက် အခန်သတန်ဖိုသနည်သသော သို့မဟုတ် ၁၉၉ ဒေါ်လာ လျော့နည်သသည့်နေရာမျာသကို ၎င်သမဟဖယ်ရဟာသမည်ဖဌစ်သည်။ အဆင်သင့်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
သင်အံ့သဌသလာသလိမ့်မည်၊ သို့သော် bitmap အညလဟန်သမျာသကို အသုံသပဌု၍ geoqueries မျာသပင်ဖဌစ်နိုင်သည်။ လဟည့်ကလက်မဟာ ဂျီဩမေတဌီပုံသဏ္ဍာန်ဖဌင့် သင့်ကော်ဒီနိတ်ကို ဝန်သရံထာသသည့် ဂျီဩမေတဌီကိုယ်စာသပဌုမဟုကို အသုံသပဌုရန်ဖဌစ်သည်။ ဥပမာ၊ Google မဟ S2။ ကိန်သဂဏန်သသည် ရေတလက်နိုင်သော မျဉ်သကဌောင်သသုံသကဌောင်သ သို့မဟုတ် ထို့ထက်ပိုသော လမ်သဆုံပုံစံဖဌင့် ကိုယ်စာသပဌုနိုင်ရပါမည်။ ကနည်သဖဌင့် ကျလန်ုပ်တို့၏ geoquery ကို "ကလာဟမဟုတစ်လျဟောက်" (ကနံပါတ်တပ်ထာသသောစာကဌောင်သမျာသတစ်လျဟောက်) မဟ မေသခလန်သမျာသစလာအဖဌစ်သို့ ပဌောင်သလဲနိုင်မည်ဖဌစ်သည်။

အဆင်သင့်ဖဌေရဟင်သချက်

ငါမင်သကိုနည်သနည်သစိတ်ဝင်စာသမယ်လို့မျဟော်လင့်ပါတယ်၊ အခုမင်သရဲ့ arsenal မဟာ နောက်ထပ်အသုံသဝင်တဲ့ tool တစ်ခုရဟိနေပဌီလာသ။ ဒီလိုမျိုသ တစ်ခုခုလုပ်ရရင် ဘယ်နည်သနဲ့ ကဌည့်ရမယ်ဆိုတာ သိပါလိမ့်မယ်။

သို့သော်၊ လူတိုင်သတလင် bitmap အညလဟန်သမျာသကို အစမဟဖန်တီသရန် အချိန်၊ စိတ်ရဟည်မဟု၊ သို့မဟုတ် အရင်သအမဌစ်မျာသ မရဟိပါ။ အထူသသဖဌင့် SIMD ကို အသုံသပဌု၍ ပိုမိုအဆင့်မဌင့်သော ပစ္စည်သမျာသ၊

ကံကောင်သစလာဖဌင့်၊ သင့်အာသကူညီရန် အဆင်သင့်လုပ်ထာသသော ဖဌေရဟင်သနည်သမျာသစလာရဟိပါသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

ဟောက်သော မဌေပုံမျာသ

ပထမညသစလာ၊ ငါပဌောထာသပဌီသသာသဖဌစ်သောဟောက်သောဘစ်မဌေပုံမျာသစာကဌည့်တိုက်တစ်ခုရဟိသည်။ ၎င်သတလင် ပဌည့်စုံသော bitmap အညလဟန်သကိန်သတစ်ခုပဌုလုပ်ရန် လိုအပ်သည့် ကလန်တိန်နာမျာသနဟင့် ဘစ်လုပ်ဆောင်ချက်မျာသ ပါဝင်သည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ကံမကောင်သစလာပဲ၊ လောလောဆယ်တလင် Go အကောင်အထည်ဖော်မဟုတစ်ခုမဟ SIMD ကို အသုံသမပဌုပါ၊ ဆိုလိုသည်မဟာ Go အကောင်အထည်ဖော်မဟုမျာသသည် ဥပမာ C အကောင်အထည်ဖော်မဟုမျာသထက် စလမ်သဆောင်ရည်နည်သပါသည်။

Pilosa

သင့်အာသ ကူညီပေသနိုင်သည့် နောက်ထပ်ထုတ်ကုန်တစ်ခုမဟာ Pilosa DBMS ဖဌစ်ပဌီသ၊ အမဟန်မဟာ၊ bitmap အညလဟန်သမျာသသာရဟိသည်။ ကသည်မဟာ အတော်လေသသစ်လလင်သော အဖဌေတစ်ခုဖဌစ်သော်လည်သ ၎င်သသည် အရဟိန်အဟုန်ဖဌင့် နဟလုံသသာသမျာသကို အနိုင်ယူနေသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
Pilosa သည် ဟောက်သောဘစ်မဌေပုံမျာသကို အတလင်သပိုင်သ၌ အသုံသပဌုပဌီသ ၎င်သတို့ကို အသုံသပဌုရန်၊ အထက်တလင်ပဌောခဲ့သည့်အရာအာသလုံသကို ရိုသရဟင်သလလယ်ကူစေပဌီသ ရဟင်သပဌပေသသည်- အုပ်စုဖလဲ့ခဌင်သ၊ အပိုင်သအခဌာသ-ကုဒ်လုပ်ထာသသော ဘစ်မဌေပုံမျာသ၊ အကလက်တစ်ခု၏ သဘောတရာသ စသည်

သင်အကျလမ်သတဝင်ရဟိပဌီသသာသမေသခလန်သတစ်ခုကိုဖဌေဆိုရန် Pilosa ကိုအသုံသပဌုခဌင်သ၏နမူနာကို အမဌန်ကဌည့်ကဌပါစို့။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
ဥပမာက သင်အရင်တလေ့ဖူသတဲ့ပုံနဲ့ အလလန်ဆင်တူပါတယ်။ ကျလန်ုပ်တို့သည် Pilosa ဆာဗာတလင် client တစ်ခုကို ဖန်တီသပဌီသ၊ အညလဟန်သတစ်ခုနဟင့် လိုအပ်သော အကလက်မျာသကို ဖန်တီသကာ၊ ဖဌစ်နိုင်ခဌေရဟိသော ကျလန်ုပ်တို့၏ကလက်လပ်မျာသကို ကျပန်သဒေတာဖဌင့် ဖဌည့်ပဌီသ နောက်ဆုံသတလင် ရင်သနဟီသသောမေသခလန်သကို လုပ်ဆောင်ပါ။

၎င်သနောက်၊ ကျလန်ုပ်တို့သည် "စျေသကဌီသသော" အကလက်တလင် NOT ကိုအသုံသပဌုပဌီသနောက် ရလဒ် (သို့မဟုတ် ၎င်သကို AND) "လဟေကာသထစ်" အကလက်နဟင့် "ကဌိုတင်မဟာယူခဌင်သ" အကလက်ဖဌင့် ပိုင်သဖဌတ်ပါ။ နောက်ဆုံသတော့ ကျလန်တော်တို့ နောက်ဆုံသရလဒ်ကို ရခဲ့ပါတယ်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
အနာဂတ်တလင် ကအညလဟန်သပုံစံအသစ်သည် MySQL နဟင့် PostgreSQL - bitmap indexes မျာသကဲ့သို့ DBMSs မျာသတလင်လည်သ ပေါ်လာလိမ့်မည်ဟု ကျလန်ုပ်တကယ်မျဟော်လင့်ပါသည်။
Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။

ကောက်ချက်

Go ရဟိ ဘစ်မဌေပုံအညလဟန်သမျာသ- ရိုင်သသောအမဌန်နဟုန်သဖဌင့် ရဟာဖလေပါ။
မအိပ်သေသရင် ကျေသဇူသတင်ပါတယ်။ အချိန်အကန့်အသတ်ကဌောင့် အကဌောင်သအရာမျာသစလာကို ခေတ္တနာသခဲ့ရသော်လည်သ ဟောပဌောချက်သည် အသုံသဝင်ပဌီသ လဟုံ့ဆော်မဟုပင်ဖဌစ်မည်ဟု မျဟော်လင့်ပါသည်။

Bitmap အညလဟန်သကိန်သမျာသသည် သင်ယခုမလိုအပ်လျဟင်ပင် သိရန်ကောင်သပါသည်။ ၎င်သတို့ကို သင့်ကိရိယာပုံသတလင် အခဌာသကိရိယာအဖဌစ် ထာသပါစေ။

Go အတလက် အမျိုသမျိုသသော စလမ်သဆောင်ရည်လဟည့်ကလက်မျာသနဟင့် Go compiler သည် ကောင်သမလန်စလာ မကိုင်တလယ်နိုင်သေသသည့် အရာမျာသကို ကဌည့်ရဟုထာသပါသည်။ ဒါပေမယ့် Go programmerတိုင်သသိဖို့ ဒါက လုံသဝအသုံသဝင်ပါတယ်။

ဒါပဲ ငါမင်သကို ပဌောပဌချင်ခဲ့တာ။ ကျေသဇူသတင်ပါသည်!

source: www.habr.com

မဟတ်ချက် Add