áááá«ááºáž
áá±á¬áºá
ááá¯ááŒáá¯á·ááŸá GopherCon Russia 2019 ááœááºáááá·áºááœáẠá¡ááºá¹áááááºáá¬áá¬ááŒáá·áº á€á¡á
á®áááºáá¶á
á¬ááᯠááŸáá·áº Nizhny Novgorod ááœáẠááœá±á·áá¯á¶ááŸá¯ááœáẠáá¯ááŸá¬ážáá¬áá¬ááŒáá·áº áá±ážáá²á·áá«áááºá áá»áœááºá¯ááºááá¯á·ááẠB-tree áááºáá¬ááœááºáá±á¬ bitmap á¡ááœáŸááºážáá
áºáá¯á¡ááŒá±á¬ááºážááŒá±á¬áá±áá±á¬áºáááºáž á
áááºáááºá
á¬ážá
áá¬áááŸááá«á áá»áŸáá±ááŒááºážá
áá áºááŒá±áá¯á¶á¡ááœáŸááºážáá áºáᯠá¡áá¯ááºáá¯ááºáá¯á¶á ááá¯áá±á¬ááºážáá¬áá²á·á¡áá«á áááŒá¬ážá¡ááœáŸááºážááœá±ááẠááá¯ááá¯ážáá¬áá²á·á¡áá«á áááºááá¯á¡ááŒá±á¡áá±áá»áá¯ážááŸá¬á á¡á²áá«ááœá±ááẠáááááá¬áᬠááá¯ááŒááºááá²ááá¯áá¬ááᯠááŒáá·áºáá«áááºá áááºáá¬áááºááŒá®áž DBMS ááœá±ááŸá¬ bitmap á¡ááœáŸááºážááœá±ááŸáááŒá®ážáá¬ážáá²ááá¯áᬠááŒáá·áºááŒáá¡á±á¬ááºá Go ááœáẠáá»áœááºá¯ááºááá¯á·ááá¯ááºááá¯ááºáá±ážááẠááŒáá¯ážá á¬ážááŒáá«á áá¯á·á áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯áẠá¡ááœááºááŒááºáááºáá±á¬ á¡áá°ážááŒá¯áá±áá¬áá±á·á áºááᯠáááºáá®ážáááºá¡ááœáẠâá¡áá»áá¯ááœá²á¡ááœááºâ á¡áááºááá·áºáá¯ááºáá¬ážááá·áº á á¬ááŒáá·áºááá¯ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
áá»áœááºá¯ááºááááºáá¬áá»á¬ážááẠááá·áºá¡ááœáẠá¡áá¯á¶ážáááºááŒá®áž á
áááºáááºá
á¬ážááœááºáá±á¬ááºážáááá·áºáááºáᯠá¡ááŸááºááááºáá»áŸá±á¬áºááá·áºáá«áááºá ááœá¬áž!
áááá«ááºáž
á¡á¬ážáá¯á¶ážáááºá¹ááá¬áá«! ááá± ááŒá±á¬ááºáá¬áá®ááá¯ážáá±á¬á· á¡á¬ážáá¯á¶áž áááºáááºážáá±ááŒá®á áá»ááºážá áá¬áá±á¬ááºážáá²á· áá±áá¬áá±á·á áºá¡ááœáŸááºážááááºážáá®á¡áá¯áá®á¡ááŒá±á¬ááºáž ááŒá±á¬ááá¯á· á¡áá»áááºáá±á¬ááºážáá² ááá¯ááºáá¬ážá á áááºááá°áá«ááŸáá·áºá á€áá±áá¬ááœáẠá¡áááºážá¡ááŒá áºáá¯áẠááá¯ááºážááŸá áºááá¯ááºážááŸááá«áááºá ð
ááŒááºáá¯á¶ážááœá±áá»ááºážáá²á á¡á
á®áááºáá¶á
á¬á á¡áá»ááºá¡áááºááœá± ááŒáá·áºááŸááºáá±ááŒá®áž áá«ááá¯á·ááŸá¬ á¡áá»áááºááááºáááŸááá°ážá áá«ááᯠá
ááá¯ááºáá¡á±á¬ááºá
áá®áá±á·áá±á¬á· á¡á±á¬ááºáá«á¡ááŒá±á¬ááºážááœá±ááᯠááŒá±á¬ááŒáá«áááºá
- á¡ááœáŸááºážááááºážáá»á¬ážááẠá¡áááºáááºážá
- bitmap á¡ááœáŸááºážááááºážááá¯áá¬áá¬áá²á
- áááºážááá¯á¡áá¯á¶ážááŒá¯ááá·áºáá±áá¬ááŸáá·áº áááºááá·áºáá±áá¬ááœáẠá¡áá¯á¶ážáááŒá¯ááááºážá
- Go ááœááºááá¯ážááŸááºážáá±á¬á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááŸáá·áº compiler ááŸáá·áºá¡áá°á¡áááºážáááºáá¯ááºážáááº;
- Go assembler ááœáẠá¡áááºážáááºááá¯ážááŸááºážáá±á¬áºáááºáž ááá¯ááá¯áááá±á¬ááºáá±á¬á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á
- áá áºááŒá±áá¯á¶á¡ááœáŸááºážááááºážáá»á¬ážá "ááŒá¿áá¬áá»á¬áž"
- ááŸáááŒá®ážáá¬ážá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬ážá
áá«ááᯠá¡ááœáŸááºážááááºážááœá±á áá¬ááœá±áá²á
á¡ááœáŸááºážááẠáááºááá±áá¬á¡ááŒáẠáá»áœááºá¯ááºááá¯á·ááááºážááááºážááŒá®áž á¡ááºááááºáá¯ááºááá·áº áá®ážááŒá¬ážáá±áá¬ááœá²á·á
ááºážáá¯á¶ááŒá
áºáááºá ááŸá¬ááœá±ááŸá¯ááᯠá¡ááŸáááºááŒáŸáá·áºááẠáááºážááᯠá¡áá¯á¶ážááŒá¯áááºá á¡ááœáŸááºážáá»á¬ážááá«áá²á ááŸá¬ááœá±ááŒááºážááẠáá±áá¬ááᯠáá¯á¶ážáá¯á¶ážáá»á¬ážáá»á¬ážááŒááºáááºážááẠááá¯á¡ááºáááºááŒá
áºááŒá®áž (full scan áá¯áá±á«áºáá±á¬ áá¯ááºáááºážá
ááº)á á€áá¯ááºáááºážá
ááºááẠlinear algorithmic ááŸá¯ááºááœá±ážááŸá¯ááŸááááºá ááá¯á·áá±á¬áº áá±áá¬áá±á·á
áºáá»á¬ážááœáẠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº áá±áá¬ááá¬ááá»á¬ážá
áœá¬áá«áááºááŒá®áž linear ááŸá¯ááºááœá±ážááŸá¯ááẠááŸá±ážááœá±ážááœááºážáááºá á¡áá±á¬ááºážáá¯á¶ážá¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá±á¬á·ááá
áºááẠááá¯á·ááá¯áẠááááºážáá±áá
áºáá¯ááᯠáááŸááááºááŒá
áºáááºá
á€áááºááŸá¬ á¡ááœááºááŸá¯ááºááœá±ážáá±á¬á¡ááŒá±á¬ááºážá¡áá¬ááŒá áºááŒá®ážá ááááá¬ááºáá»á¬ážááŸáá·áº á¡áá±ážá¡áá°áá»á¬ážááŒáá·áºááŸááºáá±áá±á¬áºáááºážá áááºá á¯ááŸá áºáá»á¬ážá áœá¬ááŒá¬áá±áá¬áá±á·á áºááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááŸáá·áº áá¯áá±ááááá¯ááŒáá·áºááŸá¯ááŒá®ážáá±á¬ááºá áá±áá¬áá±á·á áºá¡ááœáŸááºážáá»á¬ážáááºáá®ážáá¬ááœáẠá¡áá¯á¶ážáá»á¬ážáá±á¬áá»ááºážáááºáááºážá¡áááºážáááºáá»áŸáá¬ááŸááááºáᯠáá»áœááºáá±á¬áºááŒá±á¬ááá¯áá«áááºá
ááááááºážáááºážááŸá¬ ááŸá¬ááœá±ááŸá¯áá±áá¬ááᯠá¡ááá·áºááá·áºáá»áŸá±á¬á·áá»ááŒá®áž ááŸá¬ááœá±ááŸá¯áá±áá¬ááᯠá¡ááá¯ááºážáááºáá»á¬ážá¡ááŒá
Ạááá¯ááºážááŒá¬ážáááºááŒá
áºáááºá
á¡áá»áá¯ážáá»áá¯ážáá±á¬áá áºáááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á á€á¡áá¬ááᯠáá»áœááºá¯ááºááá¯á· ááŒá¯áá¯ááºáá±á·ááŸááááºá á¥ááá¬áá áºáá¯ááẠááá°áá®áá±á¬á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááŒáá·áº ááœá²áá¬ážáá±á¬ áá á¹á ááºážá¡áá±ážá á¬ážáá±áá¹áá¬áá»á¬ážáá«ááŸááá±á¬ ááá·áºáá®ááá¯áá²ááœáẠááŒá®ážáá¬ážáá±á¬áá á¹á ááºážáá»á¬ážááŒá áºáááºá áááºáá á¹á ááºážáá»á¬ážááá¯á¡ááºáá«áá "ááœááºáá®ážáá»á¬áž" áá¯ááŒá±á¬ááá·áºá¡á á¬áž "áá á¹á ááºážáá»á¬áž" áá¯ááŒá±á¬ááá·áºáá±áá¹áá¬áá²ááœáẠáááºážááá¯á·ááá¯ááŸá¬ááœá±ááá¯ááºáááá·áºáááºááá¯ááºáá±á
áá¯ááááááºážáááºážááŸá¬ ááá¯áá»ááºáá±á¬ááŒááºá
áẠááá¯á·ááá¯áẠááŒááºá
ááºá¡á¯ááºá
á¯ááᯠáá»ááºáá»ááºážááœá±ážáá»ááºáááºááŒá
áºáááºá áááºážááᯠhash ááŒá±áá¯á¶áá»á¬áž ááá¯á·ááá¯áẠááŒá±á¬ááºážááŒááºá¡ááœáŸááºážáá»á¬ážááœáẠááŒá¯áá¯ááºáá«áááºá hash ááŒá±áá¯á¶áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááẠááááºááá°áá¬ááŸáá·áº á¡ááœááºáááºáá°áá±á¬áºáááºážá áá±áá¹áá¬áá
áºáá°ážá¡á
á¬ážá ááá·áºáá®ááá¯áá²ááœáẠáá±á¬ááºáá¯á¶ážáá
á¹á
ááºážáá»á¬ážá áá±áá¹áá¬áááºáá»á¬ážá
áœá¬ááŸááááºá
áááááááºážáááºážááŸá¬ ááŸá¬ááœá±ááẠááá¯á¡ááºááŸá¯ááᯠáááºááŸá¬ážáááºááŒá
áºáááºá Bloom filters ááá¯á·ááá¯áẠcuckoo filters áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áááºážááᯠáá¯ááºáá±á¬ááºáááºá ááá áá°áá»á¬ážááẠáá»ááºáá»ááºáž á¡ááŒá±áá±ážá ááŸá¬ááœá±ááẠáááá¯á¡ááºáá±á¬á·áá«á
áá±á¬ááºáá¯á¶ážáááºážáááºážááŸá¬ áá»áœááºá¯ááºááá¯á·á¡á¬áž áá±ááºáá® hardware ááŸáá±ážáá±á¬ áá«áá«á¡á¬ážáá¯á¶ážááᯠá¡ááŒáá·áºá¡áá¡áá¯á¶ážááŒá¯áááºááŒá
áºáááºá á€áááºááŸá¬ áá
áºááŒá±áá¯á¶á¡ááœáŸááºážáá»á¬ážááœáẠáá»áœááºá¯ááºááá¯á·áá¯ááºáá±á¬ááºááá·áº á¡ááá¡áá»ááŒá
áºáááºá áá¯ááºáááºá á¡á²áá«ááœá±ááᯠáá¯á¶ážáá²á·á¡áá« áá
áºáá«ááá±ááŸá¬ á¡ááœáŸááºážáá
áºáá¯áá¯á¶ážááᯠááŒááºááœá¬ážáááŸá¬ááŒá
áºáá±ááá·áº á¡á²áá«ááᯠá¡ááœááºáááá±á¬ááºá
áœá¬ áá¯ááºáá±á¬ááºáá«áááºá
áá«ááŒá±á¬áá²á·áááá¯áá²á áá±áá¬áá±á·á áºá¡ááœáŸááºážááááºážááœá±áá²á· áá±á«ááºážá ááºá áá»ááºááŒá±á¬ááŒá®áž á¡áá±ážá¡áá°ááœá±áá²á· ááŒáá·áºáá±áááºá ááá¯ááá¯áááºááŸá¬ áá áºáá«áá áºáá¶ááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá áºáá»áááºáááºážááœáẠáá»ááºážáááºááŸá¯áá»á¬ážá áœá¬ááᯠáá¯á¶ážááá¯ááºáááº- áá»áœááºá¯ááºááá¯á·ááẠááŸá¬ááœá±ááŸá¯ááᯠááá¯ááá¯á¡ááŸáááºááŒáŸáá·áºááẠááá¯á¡ááºáá«á ááá¯á·ááá¯áẠááŒá áºááá¯ááºááá·áº ááŸá¬ááœá±ááŸá¯á¡áá»áá¯ážá¡á á¬ážá¡á¬ážáá¯á¶ážááᯠááœáŸááºážááŒá¯á¶ááẠááá¯á¡ááºáá«áá
áá®áá±á·áá±á¬á· áá® bitmap indexes ááœá±áá²á· áá°áááááºážáá²á· áá»ááºážáááºáááºážá¡ááŒá±á¬ááºáž ááŒá±á¬ááŒáá«áááºá
áá®á¡ááŒá±á¬ááºážá¡áá¬áá²á· áááºáááºááŒá®áž áá«á áááºáá°áá²á
áá»áœááºá¯ááºááẠBadoo ááœáẠá¡ááœá²á·áá±á«ááºážáá±á¬ááºá¡ááŒá
Ạá¡áá¯ááºáá¯ááºáá«ááẠ(áá»áœááºá¯ááºááá¯á·á á¡ááŒá¬ážáá¯ááºáá¯áẠBumble ááŸáá·áº ááá¯áááºážááŸá®ážáááº)á áá»áœááºá¯ááºááá¯á·ááœáẠááá¹áá¬áá
áºááŸááºážááŸá áá¯á¶ážá
áœá²áá° áááºáž 400 áá»á±á¬áºááŸáááŒá®áž áááºážááá¯á·á¡ááœáẠá¡áá±á¬ááºážáá¯á¶ážááá¯ááºáá®ááŸá¯ááᯠááœá±ážáá»ááºááá·áº á¡ááºá¹áá«áááºáá»á¬ážá
áœá¬ááŸááááºá áá
áºááŒá±áá¯á¶á¡ááœáŸááºážáá»á¬ážá¡áá«á¡ááẠá
áááºááŒáá¯ááºáááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áááºážááᯠáá»áœááºá¯ááºááá¯á·áá¯ááºáá±á¬ááºáá«áááºá
áá«ááᯠbitmap index ááá¯áá¬áá¬áá²á
á¡áááºá¡ááŒá¶ááŒá¯áá¬ážááá·áºá¡ááá¯ááºáž áá
áºááŒá±áá¯á¶á¡ááœáŸááºážáá»á¬ážááẠááŸá¬ááœá±ááŸá¯á¡ááœáŸááºážááá¯á¡áá±á¬ááºá¡áááºáá±á¬áºááẠáá
áºááŒá±áá¯á¶áá»á¬áž ááá¯á·ááá¯áẠáá
áºáááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá«á ááŸááºáá»ááºáá¯á¶ážááŒááºááœááºážááŸá á€á¡ááœáŸááºážááááºážááœáẠáá
áºáᯠááá¯á·ááá¯áẠáá
áºáá¯áááºááá¯áá±á¬ á¡á
áááºá¡ááá¯ááºážáá»á¬áž (áá°áá»á¬ážáá²á·ááá¯á·) ááŸáá·áº áááºážááá¯á·á áá¯ááºááá¹áááá»á¬áž ááá¯á·ááá¯áẠááá·áºáááºáá»ááºáá»á¬áž (á¡áááºá áá»ááºáá¯á¶ážá¡áá±á¬ááºá
áááº) ááŸáá·áº áá
áºáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá·áº á¡ááºáááá¯áá®áááºáá
áºáᯠ(ANDá ORá NOT) ) ááŸá¬ááœá±ááŸá¯áá±ážááœááºážááá¯ááŒá±ááá¯áááºá
áááá·áºáá±á¬ cardinality áá±á¬áºáá¶á¡áá»á¬ážá¡ááŒá¬ážááœáẠá
á¯á¶á
ááºážáá±ážááŒááºážááŸá¯áá»á¬áž áá±á«ááºážá
ááºáá¬ážáá±á¬ ááŸá¬ááœá±ááŸá¯áá»á¬ážááœáẠáá
áºááŒá±áá¯á¶á¡ááœáŸááºážáá»á¬ážááẠá¡ááá·áºáá±á¬áºáá¯á¶ážááŒá
áºááŒá®áž á¡ááœááºá
áœááºážáá±á¬ááºááá¯ááºááẠ("áá»ááºáá¯á¶ážá¡áá±á¬ááº" ááá¯á·ááá¯áẠ"á¡áááºáá±á¬ááºáá±ážá¡ááŒá±á¡áá±" ááŸáá·áº "ááŒáá¯á·áááºááŸá¡ááœá¬á¡áá±áž" áá²á·ááá¯á·áá±á¬ á¡áá¬áá
áºáá¯áá¯ááŸáá·áº ááá·áºáá»ááºáááºááŒá
áºáá±áááº)á áá«áá±ááá·áº ááŒáá·áºáá¬ážáá²á· cardinality áá±á¬áºáá¶ááœá±ááŸá¬áááºáž áá°ááá¯á·áá±á¬ááºážáá±á¬ááºážá¡áá¯ááºáá¯ááºáááºááá¯áá¬ááᯠáá±á¬ááºááŸááŒáá«áááºá
bitmap á¡ááœáŸááºážáá²á· á¡ááá¯ážááŸááºážáá¯á¶áž á¥ááá¬ááᯠááŒáá·áºáá¡á±á¬ááºá
áá»áœááºá¯ááºááá¯á·ááœáẠá€áá²á·ááá¯á·áá±á¬ ááœááá¯ááºááá¹áááá»á¬ážááŸááá±á¬ áá±á¬áºá
ááᯠá
á¬ážáá±á¬ááºááá¯ááºáá»á¬ážá
á¬áááºážááŸááááºááᯠááŒááºáá±á¬ááºááŒáá·áºáá«-
- áááºáááá¯á¡áá®ážá
- áá®ážááá·áºáá¬ážáá«áááºáááºáž ááŸááá«áááºá
- ááááºáᬠ(ááá¬áá±á¬ááºáá«)á
- áááºááẠá á¬ážááœá²ááᯠááŒáá¯áááºááŸá¬áá°ááá¯ááºááẠ(ááŒáá¯áááºááŸá¬áá°ááŸá¯áá»á¬ážááᯠáááºáá¶áááº);
- áááºáááºááœááºááá¬ážáá»á¬ážá¡ááœáẠááá·áºáá±á¬áºááẠ(vegan friendly);
- áá±ážááŒá®áž (á á»á±ážááŒá®áž)á
á
á¬ážáá±á¬ááºááá¯ááºáá
áºáá¯á
á®ááᯠ0 ááŸá
áááºááá·áº áá¶áá«ááºáá
áºáá¯áá±ážáᬠ6 bitmap (áááá±ááá
áºáá¯á
á®á¡ááœáẠáá
áºáá¯) á¡ááœáẠmemory ááᯠááœá²áá±ááŒáá«á
áá¯á·á ááá¯á·áá±á¬áẠá
á¬ážáá±á¬ááºááá¯ááºááœáẠá€ááá¯ááºááá¯ááºááŸá¯ááŸááááŸááá±á«áº áá°áááºá á€áá
áºááŒá±áá¯á¶áá»á¬ážááᯠááŒáá·áºááœááºážáá«áááºá á
á¬ážáá±á¬ááºááá¯áẠ4 ááœáẠááááºáá¬ááŸááá«áá "ááááºáá¬ááŸááááº" áá
áºááŒá±áá¯á¶ááŸá áá¶áá«áẠ4 ááᯠ1 (ááááºáá«áááŸááá»áŸáẠ0 ááá¯á·) áááºááŸááºáá«áááºá
ááᯠáá»áœááºá¯ááºááá¯á·ááœáẠááŒá
áºááá¯ááºáá»á± á¡ááá¯ážááŸááºážáá¯á¶áž bitmap á¡ááœáŸááºážááááºážááŸáááŒá®ážá áá²á·ááá¯á·áá±á¬ áá±ážááœááºážáá»á¬ážááᯠááŒá±ááá¯ááẠáááºážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
- âáááºáááºááœááºá á¬ážááá¯á·á¡áááºááŒá±áá²á· á á¬ážáá±á¬ááºááá¯ááºááœá±ááᯠááŒáá«â;
- "áááºáž á á¬ážááœá²ááŒáá¯áááºáá¬ážááá¯ááºáá²á· ááááºáá¬áá²á· áá±ážáááŒá®ážáá²á· á á¬ážáá±á¬ááºááá¯ááºááœá±ááᯠááŒáá«á"
áááºááá¯áá²? áá
áºáá»ááºááŒáá·áºááá¯ááºáá¡á±á¬ááºá ááááá±á¬ááºážááá¯áá»ááºááẠá¡ááœááºááá¯ážááŸááºážáá«áááºá áá»áœááºá¯ááºááá¯á·áá¯ááºáááºááá¯á¡ááºáááºááŸá¬ "áááºáááºááœááºá
á¬ážáá°ááŸáá·áºá¡áááºááŒá±áá±á¬" bitmap ááá¯áá°ááŒá®áž áááºážááá¯ááœá±á·ááŒááºáááá·áº á
á¬ážáá±á¬ááºááá¯ááºáá»á¬ážá
á¬áááºážá¡ááŒá
áºááá¯á· ááŒá±á¬ááºážáá²ááá¯ááºáá«á
áá¯ááááá±á¬ááºážááá¯áá»ááºá áááºážáááºážááá¯ááŸá¯ááºááœá±ážáá«áááºá áá±ážáááŒá®ážáá±á¬á
á¬ážáá±á¬ááºááá¯ááºáá»á¬ážá
á¬áááºážááá¯ááá°ááẠ"á
á»á±ážááŒá®ážáá±á¬" bitmap ááœáẠNOT bitmap ááá¯á¡áá¯á¶ážááŒá¯áááºááá¯á¡ááºááŒá®ážá ááá¯á·áá±á¬áẠ"á
á¬ážááœá²ááá¯ááŒáá¯áááºááŸá¬áá°ááá¯á·ááá«ááá¬áž" bitmap ááŒáá·áºáááºážááŸáá·áºáááẠ"veranda ááŸááá«áááº" bitmap ááŸáá·áºá¡áá°áááºážááá¯áááºážááá¯á¡áá¯á¶ážááŒá¯áááºááá¯á¡ááºáááºá áááŸááá¬áá±á¬ bitmap ááœáẠáá»áœááºá¯ááºááá¯á·á á
á¶áááºááŸááºáá»ááºá¡á¬ážáá¯á¶ážááŸáá·áº ááá¯ááºáá®áá±á¬ áááºáá±á¬ááºááŸá¯á
á¬áááºážáá
áºáᯠáá«áááºáááºááŒá
áºáá«áááºá á€á¥ááá¬ááœááºá á€áááºááŸá¬ Yunost á
á¬ážáá±á¬ááºááá¯ááºáá¬ááŒá
áºáááºá
áá®á¡áá¯áá®áá»á¬ážá
áœá¬áá«áááºáá±á¬áºáááºáž á
áááºááá°áá«ááŸáá·áºá áááŒá¬áá®ááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá¯ááºááᯠááŒááºááœá±á·ááááºááŒá
áºáááºá
áá áºááŒá±áá¯á¶á¡ááœáŸááºážáá»á¬ážááᯠáááºááá·áºáá±áá¬ááœáẠá¡áá¯á¶ážááŒá¯ááááºážá
á¡áááºá áááºááẠGoogle bitmap á¡ááœáŸááºážááááºážáá»á¬ážááᯠááŒá¯áá¯ááºáá«áá á¡ááŒá±áá»á¬ážá 90% ááẠOracle DB ááŸáá·áº áá
áºáááºážááá¯ááºáá
áºáááºáž áááºá
ááºáá±áááºááŒá
áºáá«áááºá áá«áá±ááá·áº áááŒá¬áž DBMS ááœá±ááááºáž áá®ááá¯á¡á±ážááŒáá²á· á¡áá¬ááá¯áááºáž áá¶á·ááá¯ážáá±ážááá¯ááºááŸá¬ ááá¯ááºáá¬ážá ááááºááá¯ááºáá°ážá
á¡ááááá¶ááááŸááá°á
á¬áááºážááᯠááŒáá·áºááá¯ááºáá¡á±á¬ááºá
MySQL ááẠbitmap á¡ááœáŸááºážáá»á¬ážááᯠááá¶á·ááá¯ážááá±ážáá±á¬áºáááºáž á€ááœá±ážáá»ááºááŸá¯ááᯠááá·áºááœááºážááẠá¡ááŒá¶ááŒá¯áá¬ážáá±á¬ á¡ááá¯ááŒá¯áá»ááºáá
áºáᯠááŸáááẠ(
PostgreSQL ááẠáá áºááŒá±áá¯á¶á¡ááœáŸááºážáá»á¬ážááᯠááá¶á·ááá¯ážáá«á ááá¯á·áá±á¬áº á¡ááŒá¬ážá¡ááœáŸááºážáá»á¬ážá áœá¬ááœáẠááŸá¬ááœá±ááŸá¯ááááºáá»á¬ážááᯠáá±á«ááºážá ááºáááºá¡ááœáẠááá¯ážááŸááºážáá±á¬ áá áºááŒá±áá¯á¶áá»á¬ážááŸáá·áº áá áºáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
Tarantool ááœáẠbitset á¡ááœáŸááºážáá»á¬ážááŸáááŒá®áž áááºážááá¯á·ááœáẠááá¯ážááŸááºážáá±á¬ááŸá¬ááœá±ááŸá¯áá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáááºá
Redis ááœáẠááá¯ážááŸááºážáá±á¬ bitfield áá»á¬ážááŸááááºá
MongoDB ááẠbitmap á¡ááœáŸááºážáá»á¬ážááᯠááá¶á·ááá¯ážááá±ážáá±á¬áºáááºáž á€ááœá±ážáá»ááºááŸá¯ááᯠááá·áºááœááºážááẠá¡ááŒá¶ááŒá¯áá¬ážáá±á¬ á¡ááá¯ááŒá¯áá»ááºáá
áºáá¯áááºáž ááŸááá«áááºá
Elasticsearch ááẠáá
áºááŒá±áá¯á¶áá»á¬ážááᯠá¡ááœááºážááá¯ááºážá á¡áá¯á¶ážááŒá¯áááºá
- áá«áá±áá²á· á¡áááºáá®ážáá¬ážáá»ááºážá¡áá áºáá áºáá±á¬áẠáá±á«áºáá¬áá«ááŒá®- Pilosaá áááºážááẠGo ááœáẠáá±ážáá¬ážáá¬ážáá±á¬ áááºá ááºááá¯ááºáá±á¬ áá±áá¬áá±á·á áºá¡áá áºááŒá áºáááºá áááºážááœáẠbitmap á¡ááœáŸááºážáá»á¬ážáá¬áá«áááºááŒá®áž áááºážááá¯á·ááœáẠá¡áá¬á¡á¬ážáá¯á¶ážááᯠá¡ááŒá±áá¶áá¬ážáááºá á¡á²áá«ááᯠáá±á¬ááºááŸááŒá±á¬áááºá
Go ááœáẠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá
áá«áá±ááá·áº áá¬ááŒá±á¬áá·áº bitmap indexes ááœá±ááᯠááááºá¡áá¯á¶ážáááºážáá¬áá²á áá®áá±ážááœááºážááᯠáááŒá±ááẠGo ááŸá¬ á¡ááœááºááá¯ážááŸááºážáá²á· bitmap á¡ááœáŸááºážááááºážáá
áºáá¯ááᯠáááºááá¯á¡áá±á¬ááºá¡áááºáá±á¬áºáááá²ááá¯áᬠááŒáá»ááºáá«áááºá
áá
áºááŒá±áá¯á¶áá»á¬ážááẠá¡ááŒá±áá¶á¡á¬ážááŒáá·áº áá±áá¬á¡ááá¯ááºážá¡á
áá»á¬ážáá¬ááŒá
áºáááºá Go ááœáẠá€á¡ááœáẠbyte á¡áá»ááºáá»á¬ážááᯠáá¯á¶ážááŒáá«á
áá¯á·á
áá»áœááºá¯ááºááá¯á·ááœáẠá
á¬ážáá±á¬ááºááá¯ááºáá
áºááá¯ááºá ááá¹ááá¬áááºáá
áºáá¯á¡ááœáẠáá
áºááŒá±áá¯á¶áá
áºáá¯á
á®ááŸáááŒá®áž áá
áºááŒá±áá¯á¶ááŸá áá
áºáá
áºáá¯á
á®ááẠá
á¬ážáá±á¬ááºááá¯ááºáá
áºáá¯ááœáẠá€ááá¯ááºááá¯ááºááŸá¯ááŸááááŸáááᯠááœáŸááºááŒáá«áááºá
á¡áá°á¡áá®áá±ážááá·áºáá¯ááºáá±á¬ááºáá»ááºááŸá
áºáᯠááá¯á¡ááºáá«áááºá áá»áœááºá¯ááºááá¯á·ááá
áºááŒá±áá¯á¶áá»á¬ážááᯠáá»áááºážáá±áá¬ááŒáá·áº ááŒáá·áºáááºáá
áºáá¯á¡á¬áž á¡áá¯á¶ážááŒá¯áá«áááºá áá»áááºážááŒá
áºáá±á¬áºáááºáž á
á¬ážáá±á¬ááºááá¯ááºáá
áºáá¯á
á®ááœáẠááá¯ááºááá¯ááºááŸá¯áá
áºáá¯á
á®áá«ááŸáááá·áº ááŒá
áºááá¯ááºááŒá±á¡áá»áá¯á·ááŸááááºá á¥ááá¬á¡á¬ážááŒáá·áºá áá±á¬áºá
ááá¯ááœáẠá
á¬ážááœá²ááᯠááŒáá¯áááºáááŸá¬áá°ááá¯ááºáá±á¬ á
á¬ážáá±á¬ááºááá¯ááºáá»á¬áž á¡ááœááºáááºážáá«ážáááºáᯠáá»áœááºá¯ááºáá¯á¶ááŒááºááŒá®áž ááá¯ááºáá»á¬ážá 20% ááá·áºááẠáááºáááºááœááºá
á¬ážáá°áá»á¬ážá¡ááœáẠááá·áºáá»á±á¬áºáááºáᯠáá»áœááºá¯ááºáá¯á¶ááŒááºáá«áááºá
áá¯ááááá¯ááºáá±á¬ááºáá»ááºááẠbitmap ááᯠá
á¬ážáá±á¬ááºááá¯ááºáá»á¬ážá
á¬áááºážá¡ááŒá
áºááá¯á· ááŒá±á¬ááºážáá²áá±ážáááºááŒá
áºáááºá
"áááºážáááºážááŒááºááŸá áá±ážáááºáá¬áá±á¬ á
á¬ážáá±á¬ááºááá¯ááºáá»á¬ážááᯠáá»áœááºá¯ááºá¡á¬áž ááŒá ááŒáá¯áááºá
á¬áááºážáá±ážááŸá¯áá»á¬áž ááŒá¯áá¯ááºááá¯ááºáááº" áá°áá±á¬ áá±ážááœááºážááᯠááŒá±ááá¯áááºá áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáá±á¬ááºáá»ááºááŸá
áºáᯠááá¯á¡ááºáááº- NOT ááŸáá·áº ANDá
ááá¯ááá¯ááŸá¯ááºááœá±ážáá±á¬ AND NOT á¡á±á¬áºááá±áá¬ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááá¯ááºááᯠá¡áááºážáááºááá¯ážááŸááºážá¡á±á¬ááºááŒá¯áá¯ááºááá¯ááºáá«áááºá
á€áá¯ááºáá±á¬ááºááŸá¯áá
áºáá¯á
á®á¡ááœáẠáá»áœááºá¯ááºááá¯á·ááœáẠáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááŸááááºá áááºážááá¯á·ááŸá
áºáŠážá
áá¯á¶ážááẠá¡áá»ááºáá»á¬ážááá¯ááŒááºáá¬á áá
áºáá¯á
á®á០áááºááá¯ááºáá±á¬ááŒááºá
ááºáá»á¬ážááá¯áá°áᬠá¡áááºážáááºáá¯ááºáá±á¬ááºááŸá¯ááŒáá·áº áá±á«ááºážá
ááºáᬠááááºááᯠáááŸááá¬áá±á¬á¡áá»ááºáá²ááá¯á· ááá·áºáá«á
ááᯠáá»áœááºá¯ááºááá¯á·ááẠááŸá¬ááœá±ááŸá¯áá±ážááœááºážááá¯ááŒá±ááá¯ááẠáá»áœááºá¯ááºááá¯á·ááá
áºááŒá±áá¯á¶áá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá
áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠá¡ááœááºááá¯ážááŸááºážáá±á¬áºáááºážá áá¯ááºáá±á¬ááºáá»ááºááá¯áá±á«áºááá¯ááºáž ááœááºáá±á«áºáá¬ááá·áºá¡áá»ááºá¡áá
áºáá
áºáá¯ááᯠááŒááºááá±ážááŒááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠááœá±ááŒá±ážáá»á¬ážá
áœá¬ááᯠáá»áœá±áá¬ááá¯ááºáá±á¬áºáááºáž á
áœááºážáá±á¬ááºáááºááẠááŒáá·áºáá¬ážáááºááá¯ááºáá«á
pprof ááŒáá·áº áááá¯ááá¯ááºážá¡áááºážáááºáá¯ááºááŒá®ážáá±á¬ááºá Go compiler ááẠá¡ááœááºááá¯ážááŸááºážáá±á¬áºáááºáž á¡ááœááºá¡áá±ážááŒá®ážáá±á¬ optimization ááŒá
áºáááº- function inlining ááᯠáááááŒá¯áááá«áááºá
á¡ááŸááºááŸá¬ Go compiler ááẠá¡áá»ááºáá»á¬áž ááŒááºááœá¬ážáá±á¬ loops áá»á¬ážááᯠá¡ááœááºááŒá±á¬ááºááŒá®áž ááᯠloops áá»á¬ážáá«ááŸááá±á¬ inline function áá»á¬ážááᯠá¡ááá¡áá» ááŒááºážááá¯ááŒááºážááŒá
áºáá«áááºá
áá«áá±ááá·áº áá«áááŒá±á¬ááºáá«áá°áž ááŸá±ážáá¯ááºážáááᯠloop á¡á
á¬áž goto ááá¯áá¯á¶ážááŒá®áž compiler ááá¯ááŸáá·áºá
á¬ážááá¯ááºáá«áááºá
áááºááŒááºááá·áºá¡ááá¯ááºážá ááᯠcompiler ááẠáá»áœááºá¯ááºááá¯á·ááá¯ááºáá±á¬ááºáá»ááºááᯠáá»á±á¬áºááœáŸááºá
áœá¬ááá·áºááœááºážáá«áááºá ááááºá¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠ2 ááá¯ááºáááá¯á
áá¹ááá·áºááá·áºááᯠááááºážáááºážááá¯ááºáá²á·áááºá áááá¯ážáá«áá°áž!
ááááá±á¬áá¡ááœááºááᯠá¡áá®ážáááºááŒáá·áºáá»áŸáẠáá¯ááá ááááºááá¯á·ááŸá¯ááẠá¡ááœááºááá° ááááá¯ááºáááºá ááœááºááŒá°áá¬ááẠáá»áœááºá¯ááºááá¯á·á á¡áá°áá¯á¶ážá
ááºááá¯ááºážá¡ááœááºážááœáẠá¡ááá¯ááºážááá¯ááºáááºááááááºá
á
áºáá±ážáá»ááºáá
áºáá¯ááᯠááá·áºáá¬ážáááºá á¡ááŸááºááŸá¬ Go ááẠáá¯á¶ááŒá¯á¶áá±á¬áá¬áá¬á
áá¬ážááŒá
áºááŒá®ážá áá»áœááºá¯ááºá á¡ááŒá±á¬ááºážááŒáá»ááºáá¯á¶ážáᯠ(á¡áá»ááºáá¯á¶ážáá»ááº) ááẠá¡ááœááºá¡á
á¬ážááœá²ááŒá¬ážáááºááᯠá
á¯á
ááºážáá°á ááŒá±á¬ááºáá«áááºá á¡á¬ážáá¯á¶ážááŒá®ážáááºáá±á¬á· buffer overflow ááá¯á· áá±á«áºáá²á· áá®á¡áá¯áá®á¡á ááŒá
áºááá¯ááºááŒá± ááŸááá«áááá·áºáááºá
á¡áá»ááºáá»á¬ážá¡á¬ážáá¯á¶ážááẠá¡ááœááºá¡á
á¬ážáá°áá®ááŒá±á¬ááºáž ááŒáááŒááºážááŒáá·áº compiler ááᯠá
áááºáá»ááŒáá«á
áá¯á·á áá»áœááºá¯ááºááá¯á·ááá¯ááºáá±á¬ááºáá»ááºá¡á
ááœáẠááá¯ážááŸááºážáá±á¬á
á
áºáá±ážáá»ááºááᯠááá·áºááœááºážááŒááºážááŒáá·áº áááºážááá¯áá¯ááºáá±á¬ááºááá¯ááºáááºá
áá«ááá¯ááŒááºáá±á¬á· compiler á áá»ááºáááºááŸááºááᯠáááºážáá¬á¡á¬ážá áá»á±á¬áºááœá¬ážáá²á·ááŒá®áž áá±á¬ááºááẠ500 nanoseconds ááᯠááááºážááá¯ááºáá«ááŒá®á
á¡áá±á¬ááºááŒá®ážááœá±
áá±á¬ááºážááŒá®á áá»áœááºá¯ááºááá¯á·á ááá¯ážááŸááºážáá±á¬ á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á០á áœááºážáá±á¬ááºáááºá¡áá»áá¯á·ááᯠááŸá áºáá¯ááºááá¯ááºáá²á·áá±á¬áºáááºáž á€ááááºááẠáááºááŸá hardware ááŒá áºááá¯ááºáááºááẠáá»á¬ážá áœá¬ááá¯ážááœá¬ážáá«áááºá
áá»áœááºá¯ááºááá¯á·áá¯ááºáá±á¬ááºááá»áŸááẠá¡ááŒá±áá¶áá áºáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááŒá áºááŒá®áž áá»áœááºá¯ááºááá¯á·ááááá¯áááºáá¬áá»á¬ážááẠáááºážááá¯á·ááᯠá¡ááœááºáááá±á¬ááºá áœá¬áá¯ááºáá±á¬ááºáá«áááºá ááá¯á·áá±á¬áº áá¶ááá±á¬ááºážá áœá¬ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááœááºáá±ážáááºáá±á¬ á¡áá¯ááºá¡ááá¯ááºážáá»á¬ážááŒáá·áº áá»áœááºá¯ááºááá¯á·á áááá¯áááºáá¬ááᯠâáá»áœá±ážááœá±ážâ áá«áááºá áá»áœááºá¯ááºááá¯á·ááá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááẠbyte-by-byte á¡ááŒá±áá¶ááŒáá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáá«áááºá UInt8 á¡áá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á 64-byte á¡áá¯á¶ážáá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºááẠáá»áœááºá¯ááºááá¯á·ááá¯ááºááᯠá¡ááœááºááá° ááŒááºáááºááá¯ááºáááºá
áááºááŒááºááá·áºá¡ááá¯ááºážá á€áá±ážáááºáá±á¬ááŒá±á¬ááºážáá²ááŸá¯ááẠá¡áá¯ááºá¡ááœááºá¡á
á¬ážááᯠááŸá
áºáááá¯ážááŒááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááááá¯ááááºááᯠááŸá
áºáá¡ááŸáááºááŒáŸáá·áºá
á±áááºá á¡ááŒááºááᯠlinear áᯠááá¯ááá¯ááºáá«áááºá
áááºáááºááŸá¯ááœáẠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá
áá«áá±ááá·áº áá«á á¡áá¯á¶ážááá¯ááºáá«áá°ážá áá»áœááºá¯ááºááá¯á·ááááá¯áááºáá¬áá»á¬ážááẠ16á 32 ááŸáá·áº 64 bytes áá»á¬ážááá¯ááẠá¡áá¯á¶ážá¡áá²áá»á¬ážááŒáá·áº á¡áá¯ááºáá¯ááºááá¯ááºáááºá ááá¯áá²á·ááá¯á·áá±á¬ "áá»ááºááŒáá·áºáá±á¬" áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠsingle instruction multiple data (SIMD; ááœáŸááºááŒá¬ážáá»ááºáá
áºáá¯á áá±áá¬áá»á¬ážá
áœá¬) áá¯áá±á«áºááŒá®áž ááá¯ááá¯á·áá±á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááá¯á¡áá¯á¶ážááŒá¯áááºá¡ááœáẠáá¯ááºá¡ááœááºááŒá±á¬ááºážááŒááºážáá¯ááºáááºážá
ááºááᯠvectorization áá¯áá±á«áºáááºá
áá¶ááá±á¬ááºážá áœá¬áá²á Go compiler ááẠvectorization ááœááºá¡ááœááºáá±á¬ááºážááœááºáááºá áá±á¬áá±á¬áááºááœáẠGo áá¯ááºááᯠvectorize áá¯ááºááẠáá áºáá¯áááºážáá±á¬áááºážáááºážááŸá¬ Go assembler ááᯠá¡áá¯á¶ážááŒá¯á á€áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠááá¯ááºááá¯ááºááá·áºááœááºážáááºááŒá áºáááºá
Go assembler ááẠáá°ážáááºážáá±á¬ áá¬ážáá²áá
áºáá±á¬ááºááŒá
áºáááºá assembly language ááẠáááºáá±ážáá¬ážáá±áá±á¬ ááœááºáá»á°áá¬á áááá¯áá¬áááºáá¬ááŸáá·áº ááŒá®ážáá¬ážá
áœá¬ áááºá
ááºáá±ááá·áº á¡áá¬ááŒá
áºáááºááᯠáááºááááá¯ááºáá±á¬áºáááºáž Go ááœáẠááá¯ááá¯á·ááá¯ááºáá«á Go assembler ááẠIRL (á¡áááºá¡áááºááá¯ááºá
á¬ážááŒá¯áá¬áá¬á
áá¬áž) ááá¯á·ááá¯áẠá¡áááºá¡áááºáá¬áá¬á
áá¬ážááŸáá·áº ááá¯ááá°áááº- áááºážááẠáááºááœá±á·á¡á¬ážááŒáá·áº ááááºáá±á¬ááºážááœáẠáá®ážááŒá¬ážááŒá
áºáááºá Rob Pike á á¡áá±á¬ááºážáá¯á¶áž á
áœááºážáá±á¬ááºáá±ážáá²á·áá«áááºá
ááá¯á·á¡ááŒááºá Go ááẠá¡áá»á¬ážá¡á¬ážááŒáá·áº áááºáá¶áá¬ážáá±á¬ AT&T ááŸáá·áº Intel áá±á¬áºáááºáá»á¬ážááŸáá·áº ááœá²ááŒá¬ážááá·áº áá¯á¶ááŸááºááá¯ááºáá±á¬ Plan 9 áá±á¬áºáááºááᯠá¡áá¯á¶ážááŒá¯áááºá
Go assembler ááᯠáááºááŒáá·áºáá±ážááŒááºážááẠá¡áá»á±á¬áºáá¯á¶ážááá¯ááºááŒá±á¬ááºáž á
áááºáá»ááá¯ááºáááºá
ááá¯á·áá±á¬áº áá¶áá±á¬ááºážáá±á¬ááºáá
áœá¬á áá»áœááºá¯ááºááá¯á·ááᯠGo assembler áá±ážááẠáá°áá®áá±ážááá·áº á¡ááá·áºááŒáá·áºáááááᬠááŸá
áºáá¯ááŸááááº- PeachPy ááŸáá·áº avoá á¡áá¯á¶ážá¡áá±á¬ááºááŸá
áºáá¯áá¯á¶ážááẠPython ááŸáá·áº Go ááœááºáá±ážáá¬ážáá±á¬á¡ááá·áºááŒáá·áºáá¯ááºá០Go assembler ááá¯áá¯ááºáá±ážáááºá
á€á¡áá¯á¶ážá¡áá±á¬ááºáá»á¬ážááẠááŸááºáá¯á¶áááºááœá²áá±ááŒááºážá ááœááºážáááºáá»á¬ážáá±ážáá¬ážááŒááºážáá²á·ááá¯á·áá±á¬ á¡áá¬áá»á¬ážááᯠááá¯ážááŸááºážá
á±ááŒá®áž Go ááœáẠá
á¯áá±ážááŸá¯áááá¯ááááºáá±ážááœá²ááŒááºážáá±á¬áááá¯á· áááºáá±á¬ááºááŒááºážáá¯ááºáááºážá
ááºááᯠáá±áá°áá»á¡á¬ážááŒáá·áº ááá¯ážááŸááºážá
á±áááºá
áá»áœááºá¯ááºááá¯á·ááẠavo ááá¯áá¯á¶ážáá«áááºá ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááááá¯ááááºáá»á¬ážááẠáá¯á¶ááŸáẠGo áááá¯ááááºáá»á¬ážáá®ážáá«ážááŒá
áºáááºá
á€áááºááŸá¬ avo áááá¯ááááºáá
áºáá¯á á¡ááá¯ážááŸááºážáá¯á¶áž á¥ááá¬áá
áºáá¯ááŒá
áºáááºá áá»áœááºá¯ááºááá¯á·ááœáẠAdd() áá¯ááºáá±á¬ááºáá»ááºááᯠáá°á·á¡ááá¯ááá¯áááºááŸááºáá±ážááá·áº main() áá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯ááŸáááŒá®áž áááºážááŸá¬ ááááºážááŸá
áºáá¯á¶ážááᯠáá±á«ááºážááá·áºááẠá¡áááá¹áá¬ááºááŒá
áºáááºá á¡áááºááŒáá·áº ááá·áºáááºáá»ááºáá»á¬ážááᯠááá°áááºááŸáá·áº á¡ááá²á·ááŸáá·áº ááá·áºáá»á±á¬áºáá±á¬ áááá¯áááºáᬠááŸááºáá¯á¶áááºááŸá¯áá»á¬ážáá²á០áá
áºáá¯ááᯠááá°ááẠá€áá±áá¬ááœáẠá¡áá°á¡áá®áá±ážááá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž ááŸááá«áááºá áááá¯áááºáá¬áá¯ááºáá±á¬ááºááŸá¯áá
áºáá¯á
á®ááœáẠADDQ ááœááºááœá±á·áááá·áºá¡ááá¯ááºáž avo ááœáẠáááºááá¯ááºááá·áºáá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯ááŸááááºá áá±á¬ááºáá¯á¶ážááœááºá ááááºáááºááá¯ážááᯠááááºážáááºážáááºá¡ááœáẠhelper function ááᯠáá»áœááºá¯ááºááá¯á·ááœá±á·ááŒááºááááºá
go generate ááá¯áá±á«áºááá¯ááŒááºážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠavo ááœáẠáááá¯ááááºááᯠáá¯ááºáá±á¬ááºáááºááŒá
áºááŒá®áž ááááºá¡áá±ááŒáá·áº ááá¯ááºááŸá
áºáá¯ááᯠáá¯ááºáá±ážáááá·áºáááº-
- Go assembler ááœáẠááá¬áá±á¬áá¯ááºááŒáá·áº add.sá
- stub.go ááẠááá¹áá¬ááŸá áºáá¯ááᯠáá»áááºáááºááẠáá¯ááºáá±á¬ááºáá»áẠáá±á«ááºážá á®ážáá»á¬ážáá«ááŸááááº- Go and assemblerá
ááá¯áá»áœááºá¯ááºááá¯á·ááẠavo áá¯ááºáá±á¬ááºáááºááŸáá·áºáááºááá¯á·áá¯ááºáá±á¬ááºáááºááá¯áá»áœááºá¯ááºááá¯á·ááœá±á·ááŒááºáááŒá®ážá áá»áœááºá¯ááºááá¯á·ááá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááá¯ááŒáá·áºááŸá¯ááŒáá«á
áá¯á·á áá»áœááºá¯ááºááẠáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá scalar ááŸáá·áº vector (SIMD) áá¬ážááŸááºážááŸá
áºáá»áá¯ážáá¯á¶ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá²á·áááºá
scalar áá¬ážááŸááºážááœá±ááᯠá¡áááºááŒáá·áºáá¡á±á¬ááºá
ááááºá¥ááá¬ááœááºá¡ááá¯ááºážá áá»áœááºá¯ááºááá¯á·ááẠá¡ááá²á·ááŸáá·áº ááá¬ážáááºáá±á¬ á¡ááœá±ááœá±áááºááœááºáá»áẠááŸááºáá¯á¶áááºááẠáá±á¬ááºážááá¯áá±áááºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážá¡ááœáẠá¡á±á¬á·ááºáááºáá»á¬ážááŸáá·áº á¡ááœááºá¡á
á¬ážáá»á¬ážááᯠááœááºáá»ááºááẠáááá¯á¡ááºáá«á Avo á áá«ááœá±á¡á¬ážáá¯á¶áž áá«ááá¯á·á¡ááœáẠáá¯ááºáá±ážáááºá
áá»áœááºá¯ááºááá¯á·ááẠá
áœááºážáá±á¬ááºáááºááŒáŸáá·áºáááºáááºááŸáá·áº Go compiler ááá¯ááŸáá·áºá
á¬ážáááºá¡ááœáẠá¡ááœáŸááºážáá»á¬ážááŸáá·áº goto (ááá¯á·ááá¯áẠjumps) ááá¯á¡áá¯á¶ážááŒá¯áá²á·áá°ážáá±á¬áºáááºáž ááá¯á¡áá« áááºážááᯠá
áááºáá¯ááºáá±á¬ááºáá±áá«áááºá á¡áááá¡áá»ááºááŸá¬ áá¶ááá¬áá»á¬ážááẠááŒáá·áºáá¬ážáá±á¬á¡ááá·áº á¡áá°á¡ááá
áºáá¯ááŒá
áºáááºá áááºáááºáá°ááœáẠáá»áœááºá¯ááºááá¯á·ááœáẠá¡ááœáŸááºážáá»á¬ážááŸáá·áº áá¯ááºááŒááºážáá»á¬ážáá¬ááŸááááºá
áá»ááºáá¯ááºááẠá¡áá»áœááºážááááºááŸáááŒá®áž áá¬ážáááºááá¯ááºááá«áááºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááœáŸááºážáá»á¬ážááŸáá·áº áá¯ááºááŒááºážáá»á¬ážááŒáá·áº ááœááºážáááºáá
áºáá¯ááᯠá¡áá¯áá°áá¬á áá»áœááºá¯ááºááá¯á·á á¡áá»ááºááŸá
áºáá¯á០áá±áá¬á¡áááºážáááºááᯠáá°áᬠáááºážááá¯á·ááᯠá¡áááºážáááºáá¯ááºáá±á¬ááºááŸá¯ááŒáá·áº áá±á«ááºážá
ááºáá« (á€ááá
á¹á
ááœáẠááá¯ááºáá«) ááá¯á·áá±á¬áẠááááºááᯠááááºá¡áá»ááºáá²ááá¯á· ááá·áºáá«á á¡á¬ážáá¯á¶ážá
á€áááºááŸá¬ áá±á¬ááºáá¯á¶ážáááºáááºáá°áá¯ááºááŸáá·áºáá°áááºá áá»áœááºá¯ááºááá¯á·ááẠá¡á±á¬á·ááºáááºáá»á¬ážááŸáá·áº á¡ááœááºá¡á
á¬ážáá»á¬ážááᯠááœááºáá»ááºááẠáááá¯á¡ááºáá« (á¡á
áááºážáá±á¬ááºááŒáá·áº áá®ážáá±á¬ááºážááá¯ážááŒáá¬ážáááº) ááá¯á·ááá¯áẠá¡áá¯á¶ážááŒá¯áá¬ážáá±á¬ á
á¬áááºážáá»á¬ážááᯠááŸááºáá¬ážáá¬ážááẠ(á¡áá®áá±á¬ááºááŒáá·áº áá®ážáá±á¬ááºážááá¯ážááŒáá¬ážáááº)á
á
á¯á
ááºážááŸá¯áá¬áá¬á
áá¬áž á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á á
áœááºážáá±á¬ááºáááºááᯠGo ááœáẠá¡áá±á¬ááºážáá¯á¶áž á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á á
áœááºážáá±á¬ááºáááºááŸáá·áº ááŸáá¯ááºážááŸááºáá«áá áááºážááẠáá°áá®ááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á· ááŒááºááœá±á·ááá«áááºá ááŒá®ážáá±á¬á· áá«á áá»áŸá±á¬áºááá·áºáááºá áá±á¬ááºáá¯á¶ážááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá°ážáá°ážááŒá¬ážááŒá¬áž áá¬á០ááá¯ááºáá²á·áá« - Go compiler á áá¯ááºáá±á¬ááºááá·áºá¡áá¬ááᯠááŒááºáááºáá¯ááºáá¯ááºááá¯ááºáá«áááºá
áá¶ááá±á¬ááºážá áœá¬ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠcompiler ááᯠassembly language ááŒáá·áºáá±ážáá¬ážáá¬ážáá±á¬ áá»áœááºá¯ááºááá¯á·ááá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠinline áá¯ááºááẠá¡áááºážá¡áá»ááºáááŒá áºááá¯ááºáá«á Go compiler ááœáẠáááºážááá¯ááá·áºááœááºážááẠá¡áá»áááºá¡áá±á¬áºááŒá¬ áá±á¬ááºážááá¯áá¬ážáá±á¬áºáááºáž áá±á¬áá±á¬áááºááœáẠááá¯ááá¯á·áá±á¬á¡ááºá¹áá«áááºáááŸááá«á
á¡á²áá«ááŒá±á¬áá·áº assembly language ááŸá¬ áá±ážáááºáá²á· functions ááœá±ááá± á¡áá»áá¯ážáá»á±ážáá°áž áá áºá á¯á¶áá áºáá¬ááᯠááááá¯ááºáá«áá°ážá áá»áœááºá¯ááºááá¯á·ááẠááŒá®ážáá¬ážáá±á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá±ážáá¬ážááẠááá¯á·ááá¯áẠáááºá¹áá»á¬/áá áºáááºáá±á·ááºá»á¡áá áºááᯠá¡áá¯á¶ážááŒá¯ááẠááá¯á¡ááºááẠááá¯á·ááá¯áẠáááºáááºáá°áá¬áá¬á áá¬ážááᯠáá»á±á¬áºááŒááºááẠááá¯á¡ááºáááºá
ááá¯áá»áœááºá¯ááºááá¯á·ááá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá vector áá¬ážááŸááºážáá»á¬ážááá¯ááŒáá·áºááŒáá«á
áá¯á·á
á€á¥ááá¬á¡ááœááºá AVX2 ááá¯áá¯á¶ážááẠáá¯á¶ážááŒááºáá²á·áááºá ááá¯á·ááŒá±á¬áá·áº 32-byte á¡áá¯á¶ážáá»á¬ážáá±á«áºááœáẠáá¯ááºáá±á¬ááºááá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá áá¯ááºáááœá²á·á
ááºážáá¯á¶ááẠscalar áá¬ážááŸááºážááŸáá·áº á¡ááœááºáááºáá°áááº- ááá·áºáááºáá±á¬ááºáá»á¬ážááᯠáááºááŒááºážá á¡ááá²á· áá»áŸáá±áá¬ážáá±á¬ ááŸááºáá¯á¶áááºááẠáá±á¬ááºážááá¯ááŒááºáž á
áááºááŒáá·áºá
áááºážáá
áºáá®ááœááºááŸá¯áá
áºáá¯ááŸá¬ ááá¯ááá¯áá»ááºááŒáá·áºáá±á¬ vector áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠá¡áá°ážáá»ááºááŒáá·áºáá±á¬ ááŸááºáá¯á¶áááºááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážáááºááŒá
áºáááºá 32-byte á¡áá¯á¶ážáá»á¬ážááá
á¹á
ááœááºá áááºážááá¯á·ááẠY ááŸáá·áº ááŸá±á·áááºáá¬ážáá±á¬ ááŸááºáá¯á¶áááºáá»á¬ážááŒá
áºáááºá ááá¯á·ááŒá±á¬áá·áº áá¯ááºááœáẠYMM() áá¯ááºáá±á¬ááºáá»ááºááᯠáááºááŒááºáááŒááºážááŒá
áºáá«áááºá á¡áááºá áá»áœááºá¯ááºááẠ512-bit á¡áá¯á¶ážáá»á¬ážááŸáá·áºá¡áá° AVX-64 ááá¯á¡áá¯á¶ážááŒá¯áá«áá ááŸá±á·áááºááŸá¬ Z ááŒá
áºáá«áááºá
áá¯ááá áááºážáá
áºáá®ááœááºááŸá¯ááŸá¬ loop unrolling áá¯áá±á«áºáá±á¬ optimization ááá¯á¡áá¯á¶ážááŒá¯ááẠáá¯á¶ážááŒááºáá²á·ááŒááºážááŒá
áºááŒá®ážá ááá¯ááá¯áááºááŸá¬ loop áá¡á
ááá¯á·ááá¯ááºáá® XNUMX loop operations ááᯠááá¯ááºááá¯ááºáá¯ááºáá±á¬ááºááŒááºážááŒá
áºáá«áááºá á€ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážá áá¯ááºááŸá áááºááœá²á¡áá±á¡ááœááºááᯠáá»áŸá±á¬á·áá»áá±ážááŒá®áž áááŸáááá¯ááºáá±á¬ á¡ááá²á·á
á¬áááºážááœááºážá¡áá±á¡ááœááºááŒáá·áº ááá·áºáááºáá¬ážáááºá
áá±á¬ááºážááŒá®á á
áœááºážáá±á¬ááºáááºáá±á¬á áá°á ááŸáááº! á¡áá±á¬ááºážáá¯á¶áž Go ááŒá±ááŸááºážáá»ááºááẠáá¯áá
áºáááá·áº á¡ááŸáááºááŒáŸáá·áºááá¯ááºáá²á·áááºá á¡áááºááŒá®ážá
áᬠááá¯ááºáá¬ážá
ááá¯á·áá±á¬áº AVX-512á prefetching ááá¯á·ááá¯áẠJIT (just-in-time compiler) ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº á€á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááá¯ááẠá¡ááŸáááºááŒáŸáá·áºááá¯ááºáááºááŒá
áºáááºá áá«áá±ááá·áº áá«á áá®ážááŒá¬ážá¡á
á®áááºáá¶á
á¬á¡ááœáẠáá±áá»á¬áá«áááºá
áá áºááŒá±áá¯á¶á¡ááœáŸááºážááááºážáá»á¬ážááŸáá·áº ááŒá¿áá¬áá»á¬áž
ááᯠáá»áœááºá¯ááºááá¯á· Go ááœáẠbitmap á¡ááœáŸááºážááááºážááᯠááá¯ážááŸááºážá
áœá¬ á¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážááŸáá·áº assembly language ááœáẠááá¯ááá¯á¡áá»áá¯ážááŸáá
á±ááá·áºáá
áºáá¯ááᯠááŒáá·áºááŸá¯ááŒá®ážááŒá®ááŒá
áºáá±á¬ááŒá±á¬áá·áº áá±á¬ááºáá¯á¶ážááœáẠbitmap indexes áá»á¬ážááᯠá¡áááºááŒá±á¬áá·áº á¡ááœááºááŸá¬ážááŸá¬ážáá«ážáá«ážá¡áá¯á¶ážááŒá¯áááŒá±á¬ááºážááᯠááœá±ážááœá±ážááŒáá«á
áá¯á·á
á
á¬ááœááºáá±á¬ááºážáá»á¬ážááœáẠbitmap á¡ááœáŸááºážááááºážáá»á¬ážááŸáá·áº ááŒá¿áá¬áá¯á¶ážáá¯ááá¯áá±á¬áºááŒáá¬ážáá±á¬áºáááºáž á
á¬ááœááºá¡áá
áºáá»á¬ážááŸáá·áº ááááºááá¯ááºáá±á¬á·ááŒá±á¬ááºáž áá»áœááºá¯ááºááŒááºážááá¯áá«áááºá áá»áœááºá¯ááºááá¯á·ááẠá€ááŒá¿áá¬áá
áºáá¯á
á®ááᯠáááºáááºááŸáá¯ááºážááŸáá¯ááºáž áá
ááºážá
á¬ážáá² áááºážááá¯á·ááᯠá¡áá±á«áºáá¶ááŒáá·áºáá«áááºá
ááŒáá·áºáá¬ážáá±á¬ cardinality ááŒá¿áá¬
ááá¯á·ááŒá±á¬áá·áºá bitmap indexes áá»á¬ážááẠcardinality áááºážáá«ážáá±á¬ ááœááºáááºáá»á¬ážá¡ááœááºáᬠááá·áºáá»á±á¬áºááŒá±á¬ááºážá ááá¯ááá¯áááºááŸá¬ áááºááá¯ážá¡áááºážáááºáá»á¬áž (á¥ááá¬á áááẠááá¯á·ááá¯áẠáá»ááºáá¯á¶ážá¡áá±á¬ááº) ááŸááááºá á¡ááŒá±á¬ááºážáááºážááŸá¬ ááá¯áá²á·ááá¯á·áá±á¬ á¡ááœááºáá»á¬ážá áá¯á¶ááŸááºááá¯ááºá
á¬ážááŒá¯ááŸá¯áá»á¬ážááŒá±á¬áá·áº (áá
áºáá¯á ááŒáá·áºáá¬ážáá±á¬ cardinality ááœááºá áááºážááẠáá±áá¬á¡ááœááºáá°áááºááŒá
áºááŒá®ážá ááá¯ááŸááá«ážá ဠbitmap á¡ááœáŸááºážááááºážáá»á¬ážááẠáá¶á·áá»ááºáž (ááŸá¬ážááŸá¬ážáá«ážáá«áž) ááŒáá·áºááœá¬ážáááºááŒá
áºáááºá
áá
áºáá«áá
áºáá¶ááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá¶áá«ááºáá»á¬ážááá¯ááá¯ááºá
á¬ážááŒá¯ááẠáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯ááá·áºá
á¶ááŸá¯ááºážáá²á·ááá¯á·áá±á¬ ááá°áá®áá±á¬ááá¯ááºá
á¬ážááŒá¯ááŸá¯ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá ááá¯á·áá±á¬áº áááºážááẠá¡áá¬á¡á¬ážáá¯á¶ážááᯠááŒá±á¬ááºážáá²á
á±áá±á¬ compression algorithms ááœááºážáá¬ážáá²á·áááºá ááœááºáá²á·ááá·áºáááºá
á¯ááŸá
áºáá»á¬ážá¡ááœááºáž áááá¹áá¶ááá¬ááŸááºáá»á¬ážááŸáá·áº áá¯áá±áá®áá»á¬ážááẠáá
áºááŒá±áá¯á¶áá»á¬ážá¡ááœáẠcompression algorithms á¡áá»á¬ážá¡ááŒá¬ážááᯠááŸá¬ááœá±ááœá±á·ááŸááá²á·áááºá áááºážááá¯á·á á¡ááá á¡á¬ážáá¬áá»ááºááŸá¬ áá
áºááŒá±áá¯á¶áá»á¬ážááᯠáá»á¯á¶á·ááẠáááá¯á¡ááºááŒááºážááŒá
áºááẠ- áá»áœááºá¯ááºááá¯á·ááẠáá»á¯á¶á·áá¬ážáá±á¬ áá
áºááŒá±áá¯á¶áá»á¬ážáá±á«áºááœáẠáá
áºáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠááá¯ááºááá¯ááºáá¯ááºáá±á¬ááºááá¯ááºáá«áááºá
áááŒá¬áá±ážáá®áá áá±á¬ááºáá
áºááŒá±áá¯á¶áá»á¬ážáá²á·ááá¯á·áá±á¬ áá±á«ááºážá
ááºáá»ááºážáááºááŸá¯áá»á¬áž á
áááºáá±á«áºáá±á«ááºáá¬áá²á·áááºá áááºážááá¯á·ááẠáá
áºááŒá±áá¯á¶áá»á¬ážá¡ááœáẠááá°áá®áá±á¬ ááá¯ááºá
á¬ážááŒá¯ááŸá¯áá¯á¶ážáááºááᯠáá
áºááŒáá¯ááºáááºáááºáž á¡áá¯á¶ážááŒá¯ááẠ- áááºážááá¯á·ááá¯ááºááá¯áẠáá
áºááŒá±áá¯á¶áá»á¬ážá array áá»á¬ážááŸáá·áº bit runs áá¯áá±á«áºááẠ- á
áœááºážáá±á¬ááºáááºááᯠááŒáŸáá·áºáááºáááºááŸáá·áº ááŸááºáá¬ááºáá¯á¶ážá
áœá²ááŸá¯ á¡áááºážáá¯á¶ážááŒá
áºá
á±áááºá¡ááœáẠáááºážááá¯á·á¡ááŒá¬áž áá»áááºááœááºáá»áŸá¬ááŸááá±ážáááºá
áá°ááŒáá¯ááºá¡áá»á¬ážáá¯á¶áž á¡ááá®áá±ážááŸááºážáá»á¬ážááœáẠáá±á¬ááºááá·áºáá
áºááŒá±áá¯á¶áá»á¬ážááᯠáááºááŸá¬ááá¯ááºáááºá Go á¡ááœáẠá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ áá¯á¶ážáá¯áááºáá á¡áá«á¡ááẠáááá¯ááááºážáááºážáá¬áá¬á
áá¬áž á¡áá»áá¯ážáá»áá¯ážá¡ááœáẠá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ á¡áá»á¬ážá¡ááŒá¬ážááŸááá±áá«ááŒá®á
ááŒáá·áºáá¬ážáá±á¬ cardinality ááá¯ááŒá±ááŸááºážáááºáá»áœááºá¯ááºááá¯á·ááá¯áá°áá®ááá¯ááºááá·áºáá±á¬ááºáááºáááºážáááºážááᯠbinning áá¯áá±á«áºáááºá ááá·áºááœáẠáá°áá
áºáŠážá á¡áááºá¡ááŒáá·áºááᯠááá¯ááºá
á¬ážááŒá¯ááá·áº á¡ááœááºáá
áºáá¯ááŸááááºááᯠááŒááºáá±á¬ááºááŒáá·áºáá«á á¡ááŒáá·áºááẠáá±áá±á«áºá¡ááŸáẠáá¶áá«ááºááŒá
áºáá±á¬áºáááºáž áá»áœááºá¯ááºááá¯á· áá°áá¬ážáá»á¬áž ááá¯áá²á·ááá¯á· áááœá±ážáá²ááŒáá±á áá»áœááºá¯ááºááá¯á·á¡ááœáẠá¡ááẠ185,2 á
ááºáá®áá®áᬠááŸáá·áº 185,3 á
ááºáá®áá®áᬠááœá¬ááŒá¬ážáá»ááºáááŸááá«á
áá»áœááºá¯ááºááá¯á·ááẠá¡áá¬ážáá°áááºááá¯ážáá»á¬ážááᯠ1 á ááºáá®áá®áá¬á¡ááœááºáž á¡á¯ááºá á¯áá»á¬ážá¡ááŒá Ạá¡á¯ááºá á¯ááœá²á·ááá¯ááºáááºááᯠááœá±á·ááŸáááááºá
áá°á¡áááºážáááºááẠ50 á ááºáá®áá®áá¬ááẠááá¯ááŒá®áž 250 á ááºáá®áá®áá¬ááẠááŒáá·áºáááºááá¯áááºáž áá»áœááºá¯ááºááá¯á·áááá«áá áá»áœááºá¯ááºááá¯á·ááẠá¡áá¯á¶ážáááŸá cardinality ááŸááá±á¬ á¡ááœááºáá áºáá¯ááᯠá¡ááŒá±áá¶á¡á¬ážááŒáá·áº áááºááá¯áž 200 ááá·áºááŸááá±á¬ cardinality ááŸááá±á¬ ááœááºáááºáá áºáá¯á¡ááŒá ẠááŒá±á¬ááºážáá²ááá¯ááºáááºá
áá¯ááºáá«áááºá ááá¯á¡ááºáá«áá áá±á¬ááºááŸáááºáá±á¬ááºážá á áºáá¯ááºááá¯ááºáá«áááºá
Bandwidth ááŒáá·áºáá¬ážáá±á¬ ááŒá¿áá¬
bitmap á¡ááœáŸááºážááááºážáá»á¬ážá áá±á¬ááºááŒá¿áá¬ááŸá¬ áááºážááá¯á·ááᯠá¡ááºááááºáá¯ááºááŒááºážááẠá¡ááœááºá á»á±ážááŒá®ážááá¯ááºáááºá
áá±áá¬áá±á·á
áºáá»á¬ážááẠáá±áá¬ááᯠááŸá¬ááœá±áá±áá»áááºááœáẠáá¬ááŸáá·áºáá»á®áá±á¬ á
á¯á¶á
ááºážáá±ážááŒááºážááŸá¯áá»á¬áž ááŒá
áºááá¯ááºáá»á±ááŸááá±á¬ áá±áá¬ááᯠá¡ááºááááºáá¯ááºááá«áááºá áá
áºááŒáá¯ááºáááºáááºáž áá±áá¬áááºáá±á¬ááºááœáá·áº ááá¯á·ááá¯áẠá¡ááŒá¬ážáá»áŸáá±ááŸá¯ááŒá¿áá¬áá»á¬ážááᯠááŸá±á¬ááºááŸá¬ážááẠáá±á¬á·áááºááŸá¯áá»á¬áž ááá¯á¡ááºáá«áááºá áá±á¬á·áááºááŒá®ážáá
áºáá¯ááŸááá»áŸáẠá€áá±á¬á·áááºááŸá¯ááẠáá
áºááá¯á·ááœá¬ážáá±á¬á¡áá«ááœáẠááŒá¿áá¬áá
áºáá¯ááŸááááºá
sharding ááá¯á·ááá¯áẠversioned indexes ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº á€ááŒá¿áá¬ááᯠááŒá±ááŸááºážááá¯ááºááẠááá¯á·ááá¯áẠááŒááºáá»á±á¬áºááá¯ááºáááºá
Sharding ááẠááá¯ážááŸááºážááŒá®áž áá°áááá»á¬ážáá±á¬ á¡áá¬áá áºáá¯ááŒá áºáááºá áááºááẠá¡ááŒá¬ážáá±áá¬áá»á¬ážáá²á·ááá¯á· áá áºááŒá±áá¯á¶á¡ááœáŸááºážááᯠáá»áŸáá±ááá¯ááºáááºá ááŒá®ážáá¬ážáá±á¬áá±á¬á·áááºááá·áºá¡á á¬ážá áá±ážáááºáá±á¬áá±á¬á·ááá±á¬ááºáá»á¬ážá áœá¬ááᯠáááºáááŸááááºááŒá áºááŒá®áž ááá¯á·ááŒá±á¬áá·áº áá±á¬á·áááºááŒááºážá០áá¯ááºážááœááºááá¯ááºáááºááŒá áºáááºá
ááŒá¿áá¬ááá¯ááŒá±ááŸááºážááẠáá¯ááááááºážáááºážááŸá¬ áá¬ážááŸááºážá¡ááœáŸááºážááááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒá áºáááºá ááŸá¬ááœá±ááẠááá¯á·ááá¯áẠáááºááẠáááºá¡áá¯á¶ážááŒá¯ááá·áº á¡ááœáŸááºážáá áºáá¯ááŸáá·áº á á¬áá±ážááẠááá¯á·ááá¯áẠá¡ááºááááºáá¯ááºáááºá¡ááœáẠáááºá¡áá¯á¶ážááŒá¯ááá·áº á¡ááœáŸááºážáá áºáᯠááá·áºááœáẠááŸáááá¯ááºáááºá á¡áá»áááºáá¬ááá áºáá¯ááœáẠáá áºááŒááẠ(á¥ááá¬á 100 ms ááá¯á·ááá¯áẠ500 ms áá áºááŒáááº) áááºážááá¯á·ááᯠááœá¬ážááŒá®áž áá²ááŸááºáá«á áá¯ááºáá«áááºá ááá·áºáá»áŸá±á¬ááºááœáŸá¬ááẠá¡áááºážáááºáá±á¬ááºáá»áá±ááá·áº ááŸá¬ááœá±ááŸá¯á¡ááœáŸááºážááᯠááá¯ááºááœááºááá¯ááºááá·áº ááá á¹á áá»á¬ážááœááºáᬠá€áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
á€áááºážáááºážááŸá áºáá¯ááᯠáá áºááŒáá¯ááºáááºá¡áá¯á¶ážááŒá¯ááá¯ááºáááº- ááá·áºááœáẠsharded versioned index áá áºáá¯ááŸááááºá
ááá¯ááá¯ááŸá¯ááºááœá±ážáá±á¬áá±ážááœááºážáá»á¬áž
bitmap á¡ááœáŸááºážááááºážáá»á¬ážá áá±á¬ááºáá¯á¶ážááŒá¿áá¬ááŸá¬ span queries áá²á·ááá¯á·áá±á¬ ááá¯ááá¯ááŸá¯ááºááœá±ážáá±á¬ queries á¡áá»áá¯ážá¡á á¬ážáá»á¬ážá¡ááœáẠáá±á¬ááºážá áœá¬áááá·áºáá±á¬áºááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á·á¡á¬áž ááŒá±á¬ááŒá¬ážáá²á·áá«áááºá
á¡ááŸááºááááºáááºá áááºážááᯠáááºá
ááºážá
á¬ážáá«áá ANDá OR áá²á·ááá¯á·áá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠáá
áºááá»áŸáẠáá±á«áºáᬠ200 á០300 á¡áá á¡áááºážááŸá¯ááºážáá¬ážááŸááá±á¬ ááá¯áááºáá»á¬ážááᯠáá«á·ááá¯ááŒáá«" áá°áá±á¬ áá±ážááœááºážáá»á¬ážá¡ááœáẠá¡ááœááºááá·áºáá»á±á¬áºáááºááá¯ááºáá±á
áá¯á¶á¡ááŒá®áž ááá¬áá²á·áá±á¬ááŒá±ááŸááºážáá»ááºáá
áºáá¯ááẠáá±á«áºáá¬áááºááá¯ážáá
áºáá¯á
á®á¡ááœáẠááááºáá»á¬ážááá¯áá°áᬠáááºážááá¯á·á¡á¬áž á¡áááºážáááºáá»áŸáá±á¬ OR áá¯ááºáá±á¬ááºáá»ááºááŒáá·áº áá±á«ááºážá
ááºáááºááŒá
áºáááºá
á¡áááºážáááºááá¯áá±á¬ááºážááá·áºááŒá±ááŸááºážáá»ááºááŸá¬ á¡á¯ááºá
á¯ááœá²á·ááŒááºážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒá
áºáááºá á¥ááá¬á¡á¬ážááŒáá·áº áá±á«áºáᬠ50 ááŸááá±á¬ á¡ááœá²á·áá»á¬ážá áá«á áá»áœááºáá±á¬áºááá¯á·áá²á· áá¯ááºáááºážá
ááºááᯠá¡á á
á á¡ááŸáááºááŒáŸáá·áºáá±ážáá«áááá·áºáááºá
ááá¯á·áá±á¬áº á€áá±á¬ááºážááá¯ááŸá¯á¡áá»áá¯ážá¡á
á¬ážá¡ááœáẠá¡áá°ážáááºáá®ážáá¬ážáá±á¬ ááŒááºááœááºážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áºáááºáž ááŒá¿áá¬ááᯠá¡ááœááºááá° ááŒá±ááŸááºážááá¯ááºáááºá áááá¹áá¶áááºážáá»á
á¬áááºážáá»á¬ážááœáẠáááºážááᯠrange-encoded bitmap áá¯áá±á«áºáááºá
á€ááá¯ááºá
á¬ážááŒá¯ááŸá¯ááœááºá áá»áœááºá¯ááºááá¯á·ááẠá¡áá»áá¯á·áá±á¬áááºááá¯ážá¡ááœáẠáá
áºáááºážáááºážáá»áŸáᬠáááºááŸááºááŒááºážááá¯ááºáá« (á¥ááá¬á 200)á ááá¯á·áá±á¬áº á€áááºááá¯ážááŸáá·áº á¡áá¬á¡á¬ážáá¯á¶ážááᯠááá¯ááá¯ááŒáá·áºáá¬ážá¡á±á¬áẠáááºááŸááºáá«á 200 ááŸáá·áºá¡áááºá 300: 300 ááŸáá·áºá¡áááºá¡ááœáẠá¡áá°áá°áá«áá²á áá±á¬áẠ... ááŒá®ážáá±á¬á·á
á€ááá¯ááºá
á¬ážááŒá¯ááŸá¯ááᯠá¡áá¯á¶ážááŒá¯á á¡ááœáŸááºážááᯠááŸá
áºááŒáááºáá¬ááŒááºááŒááºážááŒáá·áº á€ááŸá¬ááœá±ááŸá¯áá±ážááœááºážáá»áá¯ážááᯠáá»áœááºá¯ááºááá¯á·ááŒá±ááŒá¬ážááá¯ááºáá«áááºá ááááŠážá
áœá¬á á¡áááºážá áá±á«áºáᬠááá áááºáá¬ááá·áº ááá¯á·ááá¯áẠáá±á«áºáᬠááá áá»á±á¬á·áááºážááá·áº ááá¯áááºá
á¬áááºážááᯠáá»áœááºá¯ááºááá¯á·áááŸááááºááŒá
áºááŒá®ážá ááá¯á·áá±á¬áẠá¡áááºážáááºááá¯ážáááºážáá±á¬ ááá¯á·ááá¯áẠááá áá±á«áºáᬠáá»á±á¬á·áááºážááá·áºáá±áá¬áá»á¬ážááᯠáááºážááŸáááºááŸá¬ážáááºááŒá
áºáááºá á¡áááºááá·áºá
áááºá¡á¶á·ááŒááœá¬ážáááá·áºáááºá ááá¯á·áá±á¬áº bitmap á¡ááœáŸááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á geoqueries áá»á¬ážáááºááŒá
áºááá¯ááºáááºá ááŸáá·áºááœááºááŸá¬ áá»á®á©áá±ááŒá®áá¯á¶ááá¹áá¬ááºááŒáá·áº ááá·áºáá±á¬áºáá®ááááºááᯠáááºážáá¶áá¬ážááá·áº áá»á®á©áá±ááŒá®ááá¯ááºá
á¬ážááŒá¯ááŸá¯ááᯠá¡áá¯á¶ážááŒá¯áááºááŒá
áºáááºá á¥ááá¬á Google á០S2á ááááºážááááºážááẠáá±ááœááºááá¯ááºáá±á¬ áá»ááºážááŒá±á¬ááºážáá¯á¶ážááŒá±á¬ááºáž ááá¯á·ááá¯áẠááá¯á·áááºááá¯áá±á¬ áááºážáá¯á¶áá¯á¶á
á¶ááŒáá·áº ááá¯ááºá
á¬ážááŒá¯ááá¯ááºááá«áááºá á€áááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·á geoquery ááᯠ"ááœá¬áááŸá¯áá
áºáá»áŸá±á¬ááº" (á€áá¶áá«ááºáááºáá¬ážáá±á¬á
á¬ááŒá±á¬ááºážáá»á¬ážáá
áºáá»áŸá±á¬ááº) á០áá±ážááœááºážáá»á¬ážá
áœá¬á¡ááŒá
áºááá¯á· ááŒá±á¬ááºážáá²ááá¯ááºáááºááŒá
áºáááºá
á¡áááºááá·áºááŒá±ááŸááºážáá»ááº
áá«áááºážááá¯áááºážáááºážá áááºáááºá á¬ážáááºááá¯á·áá»áŸá±á¬áºááá·áºáá«áááºá á¡áá¯áááºážáá²á· arsenal ááŸá¬ áá±á¬ááºáááºá¡áá¯á¶ážáááºáá²á· tool áá áºáá¯ááŸááá±ááŒá®áá¬ážá áá®ááá¯áá»áá¯áž áá áºáá¯áá¯áá¯ááºáááẠáááºáááºážáá²á· ááŒáá·áºááááºááá¯áᬠáááá«áááá·áºáááºá
ááá¯á·áá±á¬áºá áá°ááá¯ááºážááœáẠbitmap á¡ááœáŸááºážáá»á¬ážááᯠá¡á ááŸáááºáá®ážááẠá¡áá»áááºá á áááºááŸááºááŸá¯á ááá¯á·ááá¯áẠá¡áááºážá¡ááŒá áºáá»á¬áž áááŸááá«á á¡áá°ážáááŒáá·áº SIMD ááᯠá¡áá¯á¶ážááŒá¯á ááá¯ááá¯á¡ááá·áºááŒáá·áºáá±á¬ áá á¹á ááºážáá»á¬ážá
áá¶áá±á¬ááºážá
áœá¬ááŒáá·áºá ááá·áºá¡á¬ážáá°áá®ááẠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ ááŒá±ááŸááºážáááºážáá»á¬ážá
áœá¬ááŸááá«áááºá
áá±á¬ááºáá±á¬ ááŒá±áá¯á¶áá»á¬áž
ááááŠážá
áœá¬á áá«ááŒá±á¬áá¬ážááŒá®ážáá¬ážááŒá
áºáá±á¬áá±á¬ááºáá±á¬áá
áºááŒá±áá¯á¶áá»á¬ážá
á¬ááŒáá·áºááá¯ááºáá
áºáá¯ááŸááááºá áááºážááœáẠááŒáá·áºá
á¯á¶áá±á¬ bitmap á¡ááœáŸááºážááááºážáá
áºáá¯ááŒá¯áá¯ááºááẠááá¯á¡ááºááá·áº ááœááºááááºáá¬áá»á¬ážááŸáá·áº áá
áºáá¯ááºáá±á¬ááºáá»ááºáá»á¬áž áá«áááºáááºá
áá¶ááá±á¬ááºážá
áœá¬áá²á áá±á¬áá±á¬áááºááœáẠGo á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá
áºáá¯á០SIMD ááᯠá¡áá¯á¶ážáááŒá¯áá«á ááá¯ááá¯áááºááŸá¬ Go á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬ážááẠá¥ááᬠC á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬ážááẠá
áœááºážáá±á¬ááºáááºáááºážáá«áááºá
Pilosa
ááá·áºá¡á¬áž áá°áá®áá±ážááá¯ááºááá·áº áá±á¬ááºáááºáá¯ááºáá¯ááºáá
áºáá¯ááŸá¬ Pilosa DBMS ááŒá
áºááŒá®ážá á¡ááŸááºááŸá¬á bitmap á¡ááœáŸááºážáá»á¬ážáá¬ááŸááááºá á€áááºááŸá¬ á¡áá±á¬áºáá±ážáá
áºááœááºáá±á¬ á¡ááŒá±áá
áºáá¯ááŒá
áºáá±á¬áºáááºáž áááºážááẠá¡ááŸáááºá¡áá¯ááºááŒáá·áº ááŸáá¯á¶ážáá¬ážáá»á¬ážááᯠá¡ááá¯ááºáá°áá±áááºá
Pilosa ááẠáá±á¬ááºáá±á¬áá
áºááŒá±áá¯á¶áá»á¬ážááᯠá¡ááœááºážááá¯ááºážá á¡áá¯á¶ážááŒá¯ááŒá®áž áááºážááá¯á·ááᯠá¡áá¯á¶ážááŒá¯áááºá á¡áááºááœááºááŒá±á¬áá²á·ááá·áºá¡áá¬á¡á¬ážáá¯á¶ážááᯠááá¯ážááŸááºážááœááºáá°á
á±ááŒá®áž ááŸááºážááŒáá±ážáááº- á¡á¯ááºá
á¯ááœá²á·ááŒááºážá á¡ááá¯ááºážá¡ááŒá¬áž-áá¯ááºáá¯ááºáá¬ážáá±á¬ áá
áºááŒá±áá¯á¶áá»á¬ážá á¡ááœááºáá
áºáá¯á ááá±á¬ááá¬áž á
áááº
áááºá¡áá»áœááºážááááºááŸáááŒá®ážáá¬ážáá±ážááœááºážáá
áºáá¯ááá¯ááŒá±ááá¯ááẠPilosa ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážáááá°áá¬ááᯠá¡ááŒááºááŒáá·áºááŒáá«á
áá¯á·á
á¥ááá¬á áááºá¡áááºááœá±á·áá°ážáá²á·áá¯á¶áá²á· á¡ááœááºáááºáá°áá«áááºá áá»áœááºá¯ááºááá¯á·ááẠPilosa áá¬áá¬ááœáẠclient áá
áºáá¯ááᯠáááºáá®ážááŒá®ážá á¡ááœáŸááºážáá
áºáá¯ááŸáá·áº ááá¯á¡ááºáá±á¬ á¡ááœááºáá»á¬ážááᯠáááºáá®ážáá¬á ááŒá
áºááá¯ááºááŒá±ááŸááá±á¬ áá»áœááºá¯ááºááá¯á·áááœááºáááºáá»á¬ážááᯠáá»áááºážáá±áá¬ááŒáá·áº ááŒáá·áºááŒá®áž áá±á¬ááºáá¯á¶ážááœáẠáááºážááŸá®ážáá±á¬áá±ážááœááºážááᯠáá¯ááºáá±á¬ááºáá«á
áááºážáá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠ"á
á»á±ážááŒá®ážáá±á¬" á¡ááœááºááœáẠNOT ááá¯á¡áá¯á¶ážááŒá¯ááŒá®ážáá±á¬áẠáááẠ(ááá¯á·ááá¯áẠáááºážááᯠAND) "ááŸá±áá¬ážáá
áº" á¡ááœááºááŸáá·áº "ááŒáá¯áááºááŸá¬áá°ááŒááºáž" á¡ááœááºááŒáá·áº ááá¯ááºážááŒááºáá«á áá±á¬ááºáá¯á¶ážáá±á¬á· áá»áœááºáá±á¬áºááá¯á· áá±á¬ááºáá¯á¶ážááááºááᯠááá²á·áá«áááºá
á¡áá¬áááºááœáẠá€á¡ááœáŸááºážáá¯á¶á
á¶á¡áá
áºááẠMySQL ááŸáá·áº PostgreSQL - bitmap indexes áá»á¬ážáá²á·ááá¯á· DBMSs áá»á¬ážááœááºáááºáž áá±á«áºáá¬áááá·áºáááºáᯠáá»áœááºá¯ááºááááºáá»áŸá±á¬áºááá·áºáá«áááºá
áá±á¬ááºáá»ááº
áá¡áááºáá±ážááẠáá»á±ážáá°ážáááºáá«áááºá á¡áá»áááºá¡ááá·áºá¡áááºááŒá±á¬áá·áº á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážá
áœá¬ááᯠáá±áá¹ááá¬ážáá²á·ááá±á¬áºáááºáž áá±á¬ááŒá±á¬áá»ááºááẠá¡áá¯á¶ážáááºááŒá®áž ááŸá¯á¶á·áá±á¬áºááŸá¯áááºááŒá
áºáááºáᯠáá»áŸá±á¬áºááá·áºáá«áááºá
Bitmap á¡ááœáŸááºážááááºážáá»á¬ážááẠáááºááá¯áááá¯á¡ááºáá»áŸááºááẠáááááºáá±á¬ááºážáá«áááºá áááºážááá¯á·ááᯠááá·áºáááááá¬áá¯á¶ážááœáẠá¡ááŒá¬ážáááááá¬á¡ááŒá Ạáá¬ážáá«á á±á
Go á¡ááœáẠá¡áá»áá¯ážáá»áá¯ážáá±á¬ á áœááºážáá±á¬ááºáááºááŸáá·áºááœááºáá»á¬ážááŸáá·áº Go compiler ááẠáá±á¬ááºážááœááºá áœá¬ áááá¯ááºááœááºááá¯ááºáá±ážááá·áº á¡áá¬áá»á¬ážááᯠááŒáá·áºááŸá¯áá¬ážáá«áááºá áá«áá±ááá·áº Go programmerááá¯ááºážááááá¯á· áá«á áá¯á¶ážáá¡áá¯á¶ážáááºáá«áááºá
áá«áá² áá«áááºážááᯠááŒá±á¬ááŒáá»ááºáá²á·áá¬á áá»á±ážáá°ážáááºáá«áááº!
source: www.habr.com