{"id":33793,"date":"2019-10-31T21:54:42","date_gmt":"2019-10-31T18:54:42","guid":{"rendered":"https:\/\/prohoster.info\/blog\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti\/"},"modified":"2019-10-31T21:54:42","modified_gmt":"2019-10-31T18:54:42","slug":"bitmap-indeksy-v-go-poisk-na-dikoj-skorosti","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti","title":{"rendered":"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/86ef928e6741022b2c0e5885a031408a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Bevezet\u0151 sz\u00f3<\/h2>\n<p>\nEzt az el\u0151ad\u00e1st angolul tartottam a GopherCon Russia 2019 konferenci\u00e1n Moszkv\u00e1ban, majd oroszul a nyizsnyij novgorodi meetupon. A t\u00e9ma a bitmap-index, amely b\u00e1r kev\u00e9sb\u00e9 elterjedt, mint a B-fa, de nem kev\u00e9sb\u00e9 \u00e9rdekes. Osztom meg veletek <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/WvlUH6MjUuI?list=PL3xVZC4USRNSO_kb2lh_J_no6C-KJ7Phg\">az el\u0151ad\u00e1s<\/a><\/noindex> felv\u00e9tel\u00e9t angolul \u00e9s a sz\u00f6veges \u00e1tirat\u00e1t oroszul.<\/p>\n<p>Megvizsg\u00e1ljuk, hogyan m\u0171k\u00f6dik a bitmap-index, mikor jobb, mikor rosszabb m\u00e1s indexekhez k\u00e9pest, \u00e9s milyen esetekben gyorsabb jelent\u0151sen n\u00e1luk; megn\u00e9zz\u00fck, mely n\u00e9pszer\u0171 DBMS-ekben tal\u00e1lhat\u00f3ak m\u00e1r bitmap-indexek; megpr\u00f3b\u00e1lunk \u00edrni egyet Go nyelven. Desszertk\u00e9nt pedig megl\u00e9v\u0151 k\u00f6nyvt\u00e1rakat haszn\u00e1lunk, hogy l\u00e9trehozzuk saj\u00e1t szupergyors, speci\u00e1lis adatb\u00e1zisunkat.<\/p>\n<p>Nagyon rem\u00e9lem, hogy a munk\u00e1m hasznos \u00e9s \u00e9rdekes lesz sz\u00e1motokra. Induljunk!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Bevezet\u00e9s<\/h2>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"WvlUH6MjUuI\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/WvlUH6MjUuI\/hqdefault.jpg\" alt=\"Vide\u00f3 lej\u00e1tsz\u00e1sa\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n<noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/bitmapindexes\">http:\/\/bit.ly\/bitmapindexes<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mkevac\/gopherconrussia2019\">https:\/\/github.com\/mkevac\/gopherconrussia2019<\/a><\/noindex><\/p>\n<p>Hell\u00f3 mindenkinek! Most este hat \u00f3ra van, mindannyian nagyon f\u00e1radtak vagyunk. Remek id\u0151pont besz\u00e9lni az unalmas adatb\u00e1zisok indexel\u00e9s\u00e9nek elm\u00e9let\u00e9r\u0151l, igaz? Ne agg\u00f3djatok, itt-ott lesz egy-k\u00e9t sor forr\u00e1sk\u00f3d. \ud83d\ude42<\/p>\n<p>Ha komolyan vessz\u00fck, az el\u0151ad\u00e1s tele van inform\u00e1ci\u00f3val, \u00e9s nem sok id\u0151nk van. Sz\u00f3val kezdj\u00fcnk bele.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/e778e13727700f0335a4b5558a0d8db3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMa a k\u00f6vetkez\u0151kr\u0151l fogok besz\u00e9lni:<\/p>\n<ul>\n<li>mi az index;\n<\/li>\n<li>mi az a bitmap-index;\n<\/li>\n<li>hol haszn\u00e1lj\u00e1k \u00e9s hol NEM haszn\u00e1lj\u00e1k, \u00e9s mi\u00e9rt;\n<\/li>\n<li>egyszer\u0171 implementation Go nyelven, \u00e9s egy kis k\u00fczdelem a ford\u00edt\u00f3val;\n<\/li>\n<li>egy valamivel bonyolultabb, de sokkal teljes\u00edtm\u00e9nybeli kiv\u00e1l\u00f3 Go assembly implementation;\n<\/li>\n<li>a bitmap-indexek \"probl\u00e9m\u00e1i\";\n<\/li>\n<li>l\u00e9tez\u0151 megval\u00f3s\u00edt\u00e1sok.\n<\/li>\n<\/ul>\n<h2>De mi is az index?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/b80e5b990c44814afe9150a9a82351fd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAz index egy k\u00fcl\u00f6n\u00e1ll\u00f3 adatstrukt\u00fara, amelyet a f\u0151 adatok mellett tartunk \u00e9s friss\u00edt\u00fcnk. Az\u00e9rt haszn\u00e1ljuk, hogy felgyors\u00edtsuk a keres\u00e9st. Indexek n\u00e9lk\u00fcl a keres\u00e9s teljes adat\u00e1tj\u00e1r\u00e1st ig\u00e9nyelne (ezt a folyamatot teljes \u00e1tvizsg\u00e1l\u00e1snak h\u00edvj\u00e1k), \u00e9s ennek a folyamatnak line\u00e1ris algoritmikus bonyolults\u00e1ga van. De az adatb\u00e1zisok \u00e1ltal\u00e1ban hatalmas mennyis\u00e9g\u0171 adatot tartalmaznak, \u00e9s a line\u00e1ris bonyolults\u00e1g t\u00fal lass\u00fa. Ide\u00e1lis esetben logaritmikus vagy \u00e1lland\u00f3 bonyolults\u00e1gra lenne sz\u00fcks\u00e9g\u00fcnk.<\/p>\n<p>Ez egy hatalmas, komplex t\u00e9ma, tele finoms\u00e1gokkal \u00e9s kompromisszummal, de n\u00e9h\u00e1ny \u00e9vtizednyi k\u00fcl\u00f6nb\u00f6z\u0151 adatb\u00e1zisok fejleszt\u00e9s\u00e9nek \u00e9s kutat\u00e1s\u00e1nak megtekint\u00e9se ut\u00e1n k\u00e9sz vagyok kijelenteni, hogy csak n\u00e9h\u00e1ny sz\u00e9les k\u00f6rben haszn\u00e1lt megk\u00f6zel\u00edt\u00e9s l\u00e9tezik az adatb\u00e1zis-indexek l\u00e9trehoz\u00e1s\u00e1ra.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/08a74dbb365035cd99bc94d72644a1b7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAz els\u0151 megk\u00f6zel\u00edt\u00e9s a keres\u00e9si ter\u00fclet hierarchikus cs\u00f6kkent\u00e9s\u00e9n alapul, amely a keres\u00e9si ter\u00fclet kisebb r\u00e9szekre oszt\u00e1s\u00e1t jelenti.<\/p>\n<p>Jellemz\u0151en k\u00fcl\u00f6nf\u00e9le f\u00e1kat haszn\u00e1lunk ehhez. P\u00e9ld\u00e1ul k\u00e9pzelj\u00fcnk el egy nagy dobozt az anyagokkal a szekr\u00e9ny\u00e9ben, amelyben kisebb dobozok tal\u00e1lhat\u00f3k, k\u00fcl\u00f6nb\u00f6z\u0151 t\u00e9m\u00e1k szerint elv\u00e1lasztva. Ha sz\u00fcks\u00e9ge van anyagokra, val\u00f3sz\u00edn\u0171leg a \"Materi\u00e1lok\" felirat\u00fa dobozban fog keresni, nem pedig abban, amelyen \"S\u00fctem\u00e9nyek\" \u00e1ll, ugye?<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/423fac47c748980b18af434644af4dae.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA m\u00e1sodik megk\u00f6zel\u00edt\u00e9s az, hogy azonnal kiemelj\u00fck a sz\u00fcks\u00e9ges elemet vagy elemek csoportj\u00e1t. Ezt hash map-ekben vagy ford\u00edtott indexekben val\u00f3s\u00edtjuk meg. A hash map-ek haszn\u00e1lata nagyon hasonl\u00f3 az el\u0151z\u0151 p\u00e9ld\u00e1hoz, csak itt a sok kisebb doboz helyett a szekr\u00e9ny\u00e9ben v\u00e9gs\u0151 t\u00e1rgyakkal teli kis dobozok tal\u00e1lhat\u00f3k.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/088fed0a2a0feea4a23edbf0ca654805.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA harmadik megk\u00f6zel\u00edt\u00e9s a keres\u00e9s sz\u00fcks\u00e9gess\u00e9g\u00e9nek elt\u00fcntet\u00e9se. Ezt Bloom filterekkel vagy cuckoo filterekkel val\u00f3s\u00edtjuk meg. Az els\u0151ek azonnali v\u00e1laszt adnak, megszabad\u00edtva \u00d6nt a keres\u00e9s sz\u00fcks\u00e9gess\u00e9g\u00e9t\u0151l.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/493bc4f20baacc0a5dc0faf15cc46285.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAz utols\u00f3 megk\u00f6zel\u00edt\u00e9s pedig teljes m\u00e9rt\u00e9kben a modern hardver adta lehet\u0151s\u00e9gek kihaszn\u00e1l\u00e1s\u00e1ra \u00e9p\u00edt. Ezt val\u00f3s\u00edtjuk meg bitmap indexekkel. Igen, haszn\u00e1latukkor n\u00e9ha v\u00e9gig kell j\u00e1rnunk az eg\u00e9sz indexet, de ezt szuper hat\u00e9konyan tessz\u00fck.<\/p>\n<p>Ahogy m\u00e1r eml\u00edtettem, az adatb\u00e1zis-indexek t\u00e9m\u00e1ja sz\u00e9les \u00e9s tele van kompromisszumokkal. Ez azt jelenti, hogy n\u00e9ha t\u00f6bb megk\u00f6zel\u00edt\u00e9st is egyidej\u0171leg alkalmazhatunk: ha m\u00e9g gyorsabb keres\u00e9sre van sz\u00fcks\u00e9g\u00fcnk, vagy ha minden lehets\u00e9ges keres\u00e9si t\u00edpusra ki kell terjedn\u00fcnk.<\/p>\n<p>Ma a fenti megk\u00f6zel\u00edt\u00e9sek k\u00f6z\u00fcl a legkev\u00e9sb\u00e9 ismerttel fogok foglalkozni \u2014 a bitmap indexekkel.<\/p>\n<h2>Ki vagyok \u00e9n, hogy err\u0151l besz\u00e9ljek?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/42a9d17a507c392bc202254a92dfaf41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c9n a Badoo-n\u00e1l dolgozom csapatvezet\u0151k\u00e9nt (lehet, hogy jobban ismeri m\u00e1sik term\u00e9k\u00fcnket \u2014 a Bumble-t). M\u00e1r t\u00f6bb mint 400 milli\u00f3 felhaszn\u00e1l\u00f3nk van vil\u00e1gszerte, \u00e9s sok funkci\u00f3val rendelkez\u00fcnk, amelyek a legjobb p\u00e1r keres\u00e9s\u00e9vel foglalkoznak. Ezt egyedi szolg\u00e1ltat\u00e1sok seg\u00edts\u00e9g\u00e9vel v\u00e9gezz\u00fck, amelyek k\u00f6z\u00f6tt szerepelnek a bitmap indexek is.<\/p>\n<h2>De mi is az a bitmap index?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/14f20f3697a20c02f6b3510dc7f0ae4d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA bitmap index, as the name suggests, uses bitmaps or bitsets to implement a search index. From a bird's-eye view, this index consists of one or more such bitmaps representing entities (like people) and their properties or parameters (age, eye color, etc.), along with an algorithm that uses bitwise operations (AND, OR, NOT) to respond to search queries.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/f815720330a51b1f0798e45d23160d3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWe are told that bitmap indexes are best suited and very efficient for cases where there is a search that combines queries across many columns with low cardinality (imagine 'eye color' or 'marital status' versus something like 'distance from the city center'). However, I will later show that they also work well with columns of high cardinality.<\/p>\n<p>Let's consider a simple example of a bitmap index.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/33fe23476e0931c10345d7175b83d68b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nImagine we have a list of Moscow restaurants with binary properties like these:<\/p>\n<ul>\n<li>near metro;\n<\/li>\n<li>has private parking;\n<\/li>\n<li>has terrace;\n<\/li>\n<li>accepts reservations;\n<\/li>\n<li>vegan friendly;\n<\/li>\n<li>expensive.\n<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/fcbad539ea12f79a9d06966ce308637e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLet\u2019s assign each restaurant a sequential number starting from 0 and allocate memory for 6 bitmaps (one for each characteristic). Then we will fill these bitmaps based on whether the restaurant has this property or not. If restaurant 4 has a terrace, then bit number 4 in the 'has terrace' bitmap will be set to 1 (if there is no terrace, it will be 0).<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/3709c426617d4364f392ee6b68f92b00.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNow we have the simplest bitmap index possible, and we can use it to respond to queries like:<\/p>\n<ul>\n<li>\"Show me restaurants that are vegan friendly\";\n<\/li>\n<li>\"Show me inexpensive restaurants with a terrace where reservations are accepted.\"\n<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/90acb0f890686bd52c3db1fc667f0b0b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/0fd0b7fe9f7b7039022ad5c79fe873bc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHow? Let\u2019s see. The first query is very simple. All we need to do is take the bitmap 'vegan friendly' and convert it into a list of restaurants whose bits are set.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/ef4a5cfd658ff4ef8bc0c638c4522d11.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/9cc175bae55c16018fdf5ff95517a61a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA m\u00e1sodik k\u00e9rd\u00e9s egy kicsit bonyolultabb. Sz\u00e1m\u00edt\u00e1si NOT bitm\u0171veletet kell haszn\u00e1lnunk a \"dr\u00e1ga\" bitm\u00e1trixra, hogy megkapjuk az olcs\u00f3 \u00e9ttermek list\u00e1j\u00e1t, majd ezt AND oper\u00e1torral egyes\u00edteni kell a \"asztalt lehet foglalni\" bitm\u00e1trix-szal, \u00e9s az eredm\u00e9nyt AND oper\u00e1torral egyes\u00edteni a \"van terasz\" bitm\u00e1trix-szal. A v\u00e9gs\u0151 bitm\u00e1trix tartalmazni fogja azokat a l\u00e9tes\u00edtm\u00e9nyeket, amelyek megfelelnek minden krit\u00e9riumunknak. Ebben a p\u00e9ld\u00e1ban ez csak a \u201eJugend\u201d \u00e9tterem.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/f1cdda0cbf7f15278553899cf876c17e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/126b50e0f622b6e36c461cd74e708c38.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nItt nagyon sok elm\u00e9let van, de ne agg\u00f3dj, hamarosan l\u00e1tni fogjuk a k\u00f3dot.<\/p>\n<h2>Hol haszn\u00e1lj\u00e1k a bitmaps indexeket?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/406132236c71a4f66ae79957b6e633b3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHa r\u00e1keresel a bitmaps indexekre, a v\u00e1laszok 90%-a valamilyen m\u00f3don kapcsol\u00f3dik az Oracle DB-hez. De m\u00e1s adatb\u00e1zis-kezel\u0151k is biztosan t\u00e1mogatj\u00e1k ezt a szuper dolgot, igaz? <\/p>\n<p>N\u00e9zz\u00fck \u00e1t a gyan\u00fas\u00edtottak list\u00e1j\u00e1t.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/d18d66451a8a26b0ddf121f8ec0204cd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA MySQL m\u00e9g nem t\u00e1mogatja a bitmap indexeket, de van javaslat ennek a lehet\u0151s\u00e9gnek a hozz\u00e1ad\u00e1s\u00e1ra (<noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/worklog\/task\/?id=1524\">https:\/\/dev.mysql.com\/worklog\/task\/?id=1524<\/a><\/noindex>).<\/p>\n<p>A PostgreSQL nem t\u00e1mogatja a bitmap indexeket, de egyszer\u0171 bitm\u00e1trixokat \u00e9s bitm\u0171veleteket haszn\u00e1l a t\u00f6bbi indexen v\u00e9gzett keres\u00e9si eredm\u00e9nyek kombin\u00e1l\u00e1s\u00e1ra.<\/p>\n<p>A Tarantool bitset indexeket haszn\u00e1l, \u00e9s t\u00e1mogatja a rajtuk v\u00e9gzett egyszer\u0171 keres\u00e9seket.<\/p>\n<p>A Redis egyszer\u0171 bitmez\u0151ket tartalmaz<noindex><a rel=\"nofollow\" href=\"https:\/\/redis.io\/commands\/bitfield\"> (https:\/\/redis.io\/commands\/bitfield<\/a><\/noindex>) keres\u00e9si lehet\u0151s\u00e9g n\u00e9lk\u00fcl.<\/p>\n<p>A MongoDB m\u00e9g nem t\u00e1mogatja a bitmap indexeket, de szint\u00e9n van javaslat ennek a lehet\u0151s\u00e9gnek a hozz\u00e1ad\u00e1s\u00e1ra <noindex><a rel=\"nofollow\" href=\"https:\/\/jira.mongodb.org\/browse\/SERVER-1723\">https:\/\/jira.mongodb.org\/browse\/SERVER-1723<\/a><\/noindex><\/p>\n<p>Az Elasticsearch bitm\u00e1trixokat haszn\u00e1l bels\u0151leg<noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/blog\/frame-of-reference-and-roaring-bitmaps\"> (https:\/\/www.elastic.co\/blog\/frame-of-reference-and-roaring-bitmaps<\/a><\/noindex>).<\/p>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/232d335963603d6e6dec98839fc9f486.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>De \u00faj szomsz\u00e9dunk van: Pilosa. Ez egy \u00faj nem rel\u00e1ci\u00f3s adatb\u00e1zis, amely Go nyelven k\u00e9sz\u00fclt. Csak bitmap indexeket tartalmaz, \u00e9s minden alapja ezek. Kicsit k\u00e9s\u0151bb besz\u00e9lni fogunk r\u00f3la.\n<\/li>\n<\/ul>\n<h2>Megval\u00f3s\u00edt\u00e1s Go nyelven<\/h2>\n<p>\nDe mi\u00e9rt haszn\u00e1lj\u00e1k olyan ritk\u00e1n a bitmap indexeket? Miel\u0151tt v\u00e1laszoln\u00e9k erre a k\u00e9rd\u00e9sre, szeretn\u00e9m megmutatni egy nagyon egyszer\u0171 bitmap index megval\u00f3s\u00edt\u00e1s\u00e1t Go nyelven.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/ae7f4c1a4a740fe709b05dfaee27ac9b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA bitm\u00e1trixok l\u00e9nyeg\u00e9ben egyszer\u0171 adatr\u00e9szletekb\u0151l \u00e1llnak. A Go-ban erre haszn\u00e1ljunk b\u00e1jt szeleteket.<\/p>\n<p>Van egy bitm\u00e1trixunk egy \u00e9tterem jellemz\u0151re, \u00e9s minden bit a bitm\u00e1trixban azt mondja meg, hogy a konkr\u00e9t \u00e9tterem rendelkezik-e a k\u00edv\u00e1nt tulajdons\u00e1ggal vagy sem.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/1ab628ee15887d6b3c6c99855aa610c8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nK\u00e9t seg\u00e9dfunkci\u00f3ra lesz sz\u00fcks\u00e9g\u00fcnk. Az egyiket arra fogjuk haszn\u00e1lni, hogy a bitm\u00e1trixainkat v\u00e9letlenszer\u0171 adatokkal t\u00f6lts\u00fck fel. V\u00e9letlenszer\u0171ek, de van egy bizonyos val\u00f3sz\u00edn\u0171s\u00e9g, hogy a restaurant rendelkezik minden tulajdons\u00e1ggal. P\u00e9ld\u00e1ul \u00fagy gondolom, hogy Moszkv\u00e1ban nagyon kev\u00e9s olyan \u00e9tterem van, ahol nem lehet asztalt foglalni, \u00e9s \u00fagy v\u00e9lem, hogy k\u00f6r\u00fclbel\u00fcl a helyek 20%-a alkalmas veget\u00e1ri\u00e1nusok sz\u00e1m\u00e1ra.<\/p>\n<p>A m\u00e1sodik funkci\u00f3 a bitm\u00e1trixot \u00e9ttermek list\u00e1j\u00e1ra fogja \u00e1tkonvert\u00e1lni.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/ab9c87a0ba63750116e2e7968f842a9a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/498cf7a33611d99b90197d4ee82e2834.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAhhoz, hogy v\u00e1laszoljunk a \u00bbMutasd meg a kedvez\u0151 \u00e1r\u00fa \u00e9ttermeket, ahol van terasz \u00e9s ahol lehet asztalt foglalni\u00ab k\u00e9rd\u00e9sre, k\u00e9t bin\u00e1ris m\u0171veletre lesz sz\u00fcks\u00e9g\u00fcnk: a NOT-ra \u00e9s az AND-ra.<\/p>\n<p>Kicsit egyszer\u0171s\u00edthetj\u00fck a k\u00f3dunkat, ha egy bonyolultabb AND NOT m\u0171veletet haszn\u00e1lunk.<\/p>\n<p>Van funkci\u00f3nk minden egyes ilyen m\u0171veletre. Mindkett\u0151 sz\u00e9ls\u0151s\u00e9geken halad \u00e1t, \u00e9s a megfelel\u0151 elemeket veszi az egyes t\u00f6mb\u00f6kb\u0151l, \u00e9s kombin\u00e1lja \u0151ket a bitm\u0171velettel, majd elt\u00e1rolja az eredm\u00e9nyt egy eredm\u00e9nyt\u00f6mbbe.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/ec5652a34f0370dfb03df199f341f153.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00c9s most felhaszn\u00e1lhatjuk a bitm\u00e1trixainkat \u00e9s a funkci\u00f3inkat a keres\u00e9si lek\u00e9rdez\u00e9s megv\u00e1laszol\u00e1s\u00e1ra.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/cf9500ccfe75995a6008191c16729689.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA teljes\u00edtm\u00e9ny nem olyan magas, m\u00e9g az egyszer\u0171 funkci\u00f3k ellen\u00e9re sem, \u00e9s jelent\u0151s megtakar\u00edt\u00e1st \u00e9rt\u00fcnk el azzal, hogy nem hoztunk l\u00e9tre \u00faj eredm\u00e9nyt\u00f6mb\u00f6t minden egyes funkci\u00f3h\u00edv\u00e1skor.<\/p>\n<p>A pprof profiloz\u00e1s sor\u00e1n \u00e9szrevettem, hogy a Go ford\u00edt\u00f3 kihagyott egy nagyon egyszer\u0171, de l\u00e9nyeges optimaliz\u00e1l\u00e1st: a funkci\u00f3k inlining-j\u00e1t.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/9092f5ba3940d0a4f3fbfa90b364d716.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAz a helyzet, hogy a Go ford\u00edt\u00f3ja rettenetesen f\u00e9l a t\u00f6mb\u00f6k\u00f6n v\u00e9gigfut\u00f3 ciklusokt\u00f3l, \u00e9s kategorikusan megtagadja az inlinel\u00e1st a tartalmaz\u00f3 funkci\u00f3kra.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/d1bddd62b61b367dd1f680f223fa0ce7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDe \u00e9n nem f\u00e9lek, \u00e9s \u00e1t tudom verni a ford\u00edt\u00f3t, ha goto-t haszn\u00e1lok a ciklus helyett, mint a r\u00e9gi sz\u00e9p id\u0151kben.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/5b1c3cb26b923972686047910ecd1c31.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/1ca31d12dc90931b674c6a86a4ea23bd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c9s ahogy l\u00e1tj\u00e1tok, most a ford\u00edt\u00f3 \u00f6r\u00f6mmel inlineli a funkci\u00f3nkat! V\u00e9g\u00fcl k\u00f6r\u00fclbel\u00fcl 2 mikroszekundumot tudunk megtakar\u00edtani. Nem rossz!<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/bdd6735d16082573e600bffe2cdd5662.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA m\u00e1sodik sz\u0171k keresztmetszet nem nehezen \u00e9szlelhet\u0151, ha alaposan megn\u00e9zz\u00fck az assembler kimenetet. A ford\u00edt\u00f3 a legforr\u00f3bb ciklusunkba be\u00e9p\u00edtett egy hat\u00e1r-ellen\u0151rz\u00e9st. Az a helyzet, hogy a Go biztons\u00e1gos nyelv, a ford\u00edt\u00f3 f\u00e9l a h\u00e1rom \u00e9rveimt\u0151l (h\u00e1rom t\u00f6mb) elt\u00e9r\u0151 m\u00e9retekt\u0151l. Mert akkor elm\u00e9letileg lehet\u0151s\u00e9g lenne a \u00fagynevezett puffert\u00fal\u00e1raml\u00e1s (buffer overflow) bek\u00f6vetkez\u00e9s\u00e9re.<\/p>\n<p>Nyugodtan meggy\u0151zhetj\u00fck a ford\u00edt\u00f3t, hogy minden szelet ugyanolyan m\u00e9ret\u0171. Ezt \u00fagy tehetj\u00fck meg, hogy egy egyszer\u0171 ellen\u0151rz\u00e9st adunk a funkci\u00f3nk elej\u00e9re.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/59b4ce687a11dd653e9f12fc3130d89a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEzt l\u00e1tva a ford\u00edt\u00f3 \u00f6r\u00f6mmel \u00e1tugorja az ellen\u0151rz\u00e9st, \u00e9s v\u00e9g\u00fcl 500 nanosekundot takar\u00edtunk meg.<\/p>\n<h2>Nagyobb k\u00f6tegek<\/h2>\n<p>\nRendben, siker\u00fclt kihoznunk valami teljes\u00edtm\u00e9nyt az egyszer\u0171 megval\u00f3s\u00edt\u00e1sunkb\u00f3l, de ez az eredm\u00e9ny val\u00f3j\u00e1ban sokkal rosszabb, mint ami lehets\u00e9ges a jelenlegi hardverrel.<\/p>\n<p>Amit csin\u00e1lunk, az alapvet\u0151en bitm\u0171veletek, \u00e9s a processzoraink ezt nagyon hat\u00e9konyan hajtj\u00e1k v\u00e9gre. De sajnos a processzornak nagyon kis munkadarabokat adunk. A funkci\u00f3ink b\u00e1jtonk\u00e9nt hajtj\u00e1k v\u00e9gre a m\u0171veleteket. Nagyon egyszer\u0171en finomhangolhatjuk a k\u00f3dunkat, hogy 8 b\u00e1jtos darabokkal dolgozzon, a UInt64 szeletek haszn\u00e1lat\u00e1val.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/8d1b60ba4b7046c836601631cadd0b6a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAhogy l\u00e1tj\u00e1k, ez a kis v\u00e1ltoztat\u00e1s nyolcszor gyors\u00edtotta fel a programunkat, nyolcszoros k\u00f6teg n\u00f6vel\u00e9s\u00e9vel. A nyeres\u00e9g, mondhatni, line\u00e1ris.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/0fc663412d04dd38b927de5c8776f69d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Assemblerek implement\u00e1l\u00e1sa<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/b3ef133167b89da983356b1c7389aecd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDe ez m\u00e9g nem minden. A processzoraink k\u00e9pesek 16, 32 \u00e9s m\u00e9g 64 b\u00e1jtos darabokkal dolgozni. Az ilyen \"sz\u00e9les\" m\u0171veleteket nevezz\u00fck single instruction multiple data (SIMD; egy utas\u00edt\u00e1s, sok adat), \u00e9s a k\u00f3d \u00e1talak\u00edt\u00e1sa \u00fagy, hogy ezekkel a m\u0171veletekkel dolgozzon, a vektoriz\u00e1l\u00e1s.<\/p>\n<p>Sajnos a Go ford\u00edt\u00f3ja messze nem a legjobb a vektoriz\u00e1l\u00e1sban. Jelenleg az egyetlen m\u00f3dja a Go k\u00f3d vektoriz\u00e1l\u00e1s\u00e1nak az, hogy manu\u00e1lisan beszervezz\u00fck az adatokat Go assembly haszn\u00e1lat\u00e1val.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/91278be45df67e1f9572d68fab7ebad1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA Go assembler furcsa \u00e1llat. Bizony\u00e1ra tudja, hogy az assembler valami, ami nagyon k\u00f6t\u0151dik ahhoz a sz\u00e1m\u00edt\u00f3g\u00e9p architekt\u00far\u00e1hoz, amelyre \u00edr, de Go eset\u00e9ben nem \u00edgy van. A Go assembler ink\u00e1bb olyan, mint egy IRL (intermediate representation language; k\u00f6ztes reprezent\u00e1ci\u00f3s nyelv): gyakorlatilag platformf\u00fcggetlen. Rob Pike nagyszer\u0171 el\u0151ad\u00e1st tartott err\u0151l n\u00e9h\u00e1ny \u00e9vvel ezel\u0151tt a GopherCon-on Denverben. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=KINIAgRpkDA\">el\u0151ad\u00e1s<\/a><\/noindex> err\u0151l n\u00e9h\u00e1ny \u00e9vvel ezel\u0151tt a GopherCon-on Denverben.<\/p>\n<p>Ezen k\u00edv\u00fcl a Go egy szokatlan Plan 9 form\u00e1tumot haszn\u00e1l, amely elt\u00e9r a hagyom\u00e1nyos AT&amp;T \u00e9s Intel form\u00e1tumokt\u00f3l.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/526f75eb18edfc2f851f2725e9d6f69e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nB\u00edzhatunk benne, hogy a Go assembler manu\u00e1lis meg\u00edr\u00e1sa nem a legsz\u00f3rakoztat\u00f3bb tev\u00e9kenys\u00e9g.<\/p>\n<p>De szerencs\u00e9re m\u00e1r l\u00e9tezik k\u00e9t magas szint\u0171 eszk\u00f6z, amelyek seg\u00edtenek a Go assembler \u00edr\u00e1s\u00e1ban: PeachPy \u00e9s avo. Mindk\u00e9t eszk\u00f6z Go assembler-t gener\u00e1l egy magasabb szint\u0171 k\u00f3db\u00f3l, amelyet Pythonban \u00e9s Go-ban \u00edrtunk.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/b8a7aa2c585b805e9b1f2ada186b84e8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEzek az eszk\u00f6z\u00f6k megk\u00f6nny\u00edtik olyan feladatokat, mint a regiszterek allok\u00e1l\u00e1sa, ciklusok \u00edr\u00e1sa, \u00e9s \u00f6sszess\u00e9g\u00e9ben egyszer\u0171bb\u00e9 teszik az assembly programoz\u00e1s vil\u00e1g\u00e1ba val\u00f3 bel\u00e9p\u00e9st a Go nyelvben.<\/p>\n<p>Az avo-t fogjuk haszn\u00e1lni, \u00edgy a programjaink szinte norm\u00e1lis Go programok lesznek.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/128e4adef14e5f2cf00fb5b6302ef58e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00cdgy n\u00e9z ki a legsimplebb avo-program p\u00e9lda. Van egy main() f\u00fcggv\u00e9ny\u00fcnk, amely bels\u0151leg defini\u00e1l egy Add() f\u00fcggv\u00e9nyt, amelynek l\u00e9nyege k\u00e9t sz\u00e1m \u00f6sszead\u00e1sa. Jelen vannak seg\u00e9df\u00fcggv\u00e9nyek a param\u00e9terek n\u00e9v szerinti lek\u00e9rdez\u00e9s\u00e9re \u00e9s egy szabad, megfelel\u0151 CPU regiszter megkap\u00e1s\u00e1ra. Minden CPU m\u0171veletnek van megfelel\u0151 f\u00fcggv\u00e9nye az avon, mint az ADDQ-n l\u00e1that\u00f3. V\u00e9g\u00fcl l\u00e1tunk egy seg\u00e9df\u00fcggv\u00e9nyt az eredm\u00e9ny\u00e9rt\u00e9k ment\u00e9s\u00e9re.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/01ccaa6aa6d394ef598ea2dbc9257d87.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA go generate futtat\u00e1s\u00e1val v\u00e9grehajtjuk az avo programot, \u00e9s k\u00e9t f\u00e1jl fog l\u00e9trej\u00f6nni:<\/p>\n<ul>\n<li>add.s a Go assembly nyelv\u0171 eredm\u00e9nyk\u00f3ddal;\n<\/li>\n<li>stub.go a k\u00e9t vil\u00e1g: Go \u00e9s assembly \u00f6sszek\u00f6ttet\u00e9s\u00e9hez sz\u00fcks\u00e9ges f\u00fcggv\u00e9nyfejl\u00e9cekkel.\n<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/72a9443776ecf45eef6fb97a4e08acba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMost, hogy l\u00e1ttuk, mit \u00e9s hogyan csin\u00e1l az avo, n\u00e9zz\u00fck meg a funkci\u00f3inkat. Kiviteleztem a skal\u00e1ris \u00e9s a vektori (SIMD) verzi\u00f3kat is.<\/p>\n<p>El\u0151sz\u00f6r n\u00e9zz\u00fck meg a skal\u00e1ris verzi\u00f3kat.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/ec31dbb8b97b9d7c1012a120fa18cdaf.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMint az el\u0151z\u0151 p\u00e9ld\u00e1ban, itt is k\u00e9rj\u00fck egy szabad, helyes \u00e1ltal\u00e1nos c\u00e9l\u00fa regiszter biztos\u00edt\u00e1s\u00e1t, nem kell sz\u00e1molnunk az elmozdul\u00e1sokkal \u00e9s a m\u00e9retekkel az argumentumok eset\u00e9n. Mindezt az avo elv\u00e9gzi helyett\u00fcnk.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/88085e927dd943ea0f808a28fb3ccf9b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKor\u00e1bban c\u00edmk\u00e9ket \u00e9s goto-t (vagy ugr\u00e1sokat) haszn\u00e1ltunk a teljes\u00edtm\u00e9ny n\u00f6vel\u00e9s\u00e9re \u00e9s a Go ford\u00edt\u00f3 kij\u00e1tsz\u00e1s\u00e1ra, de most ezt az elej\u00e9t\u0151l tessz\u00fck. Az a helyzet, hogy a ciklusok egy magasabb szint\u0171 fogalom. Az assembly-ben csak c\u00edmk\u00e9k \u00e9s ugr\u00e1sok l\u00e9teznek.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/9a4181248eb279d89c1445a820b06649.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA fennmarad\u00f3 k\u00f3d m\u00e1r ismer\u0151s \u00e9s \u00e9rthet\u0151 kell legyen. C\u00edmk\u00e9kkel \u00e9s ugr\u00e1sokkal emul\u00e1ljuk a ciklust, kis adatr\u00e9szleteket vesz\u00fcnk a k\u00e9t szelet\u00fcnkb\u0151l, \u00f6sszeolvasztjuk \u0151ket egy bitm\u0171velettel (jelen esetben AND NOT), majd az eredm\u00e9nyt a kimeneti szeletbe helyezz\u00fck. Ennyi.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/19275ead27f63092fc6596bed38a8d03.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00cdgy n\u00e9z ki a v\u00e9gs\u0151 assembly k\u00f3d. Nem kellett sz\u00e1molnunk az elmozdul\u00e1sokkal \u00e9s a m\u00e9retekkel (z\u00f6lddel kiemelve) vagy figyelni a haszn\u00e1lt regiszterekre (v\u00f6r\u00f6ssel kiemelve).<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/ed68528a6f852634a5b536670c6315f0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHa a teljes\u00edtm\u00e9nyt \u00f6sszehasonl\u00edtjuk az assembly implement\u00e1ci\u00f3 \u00e9s a legjobb Go implement\u00e1ci\u00f3 k\u00f6z\u00f6tt, akkor l\u00e1thatjuk, hogy az azonos. Ez v\u00e1rhat\u00f3 is. Hiszen nem csin\u00e1ltunk semmi k\u00fcl\u00f6n\u00f6set \u2014 csup\u00e1n reproduk\u00e1ltuk azt, amit a Go ford\u00edt\u00f3 csin\u00e1lna.<\/p>\n<p>Sajnos nem tudjuk r\u00e1venni a ford\u00edt\u00f3t, hogy in-line-ba integr\u00e1lja az assembly-ben \u00edrt funkci\u00f3inkat. A Go ford\u00edt\u00f3nak jelenleg nincs ilyen lehet\u0151s\u00e9ge, b\u00e1r a k\u00e9r\u00e9s, hogy ezt hozz\u00e1adj\u00e1k, m\u00e1r r\u00e9g\u00f3ta l\u00e9tezik.<\/p>\n<p>Ez\u00e9rt nem lehet semmilyen el\u0151nyt szerezni a kis assembly funkci\u00f3kb\u00f3l. Vagy nagy funkci\u00f3kat kell \u00edrnunk, vagy \u00faj math\/bits csomagot kell haszn\u00e1lnunk, vagy el kell ker\u00fcln\u00fcnk az assembly-t.<\/p>\n<p>N\u00e9zz\u00fck most meg a vektoriz\u00e1lt v\u00e1ltozatait a funkci\u00f3inknak.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/7f67c3cc855908fb47c7900d6e5d7f54.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA p\u00e9ld\u00e1hoz az AVX2-t v\u00e1lasztottam, teh\u00e1t 32 byte-os darabokkal dolgoz\u00f3 m\u0171veleteket fogunk haszn\u00e1lni. A k\u00f3d strukt\u00far\u00e1ja nagyon hasonl\u00edt a skal\u00e1ris v\u00e1ltozatra: param\u00e9terek bet\u00f6lt\u00e9se, k\u00e9r\u00e9s egy szabad \u00e1ltal\u00e1nos regiszter\u00e9rt stb.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/021e0424a0d733ec7db9edeb98ce1f65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAz egyik \u00fajdons\u00e1g, hogy a sz\u00e9lesebb vektoriz\u00e1lt m\u0171veletek speci\u00e1lis sz\u00e9les regisztereket haszn\u00e1lnak. A 32 byte-os darabok eset\u00e9ben ezek a Y el\u0151tag\u00fa regiszterek. Ez\u00e9rt l\u00e1thatod a YMM() funkci\u00f3t a k\u00f3dban. Ha AVX-512-t haszn\u00e1ltam volna 64 bites darabokkal, akkor a prefix Z lett volna.<\/p>\n<p>A m\u00e1sodik \u00fajdons\u00e1g, hogy optimaliz\u00e1l\u00e1st alkalmaztam, amelyet cikluskib\u0151v\u00edt\u00e9snek (loop unrolling) h\u00edvunk, azaz nyolc ciklusm\u0171veletet v\u00e9geztem el manu\u00e1lisan, miel\u0151tt visszaugran\u00e9k a ciklus elej\u00e9re. Ez az optimaliz\u00e1l\u00e1s cs\u00f6kkenti a k\u00f3dban l\u00e9v\u0151 \u00e1gv\u00e1laszt\u00e1sokat, \u00e9s a rendelkez\u00e9sre \u00e1ll\u00f3 szabad regiszterek sz\u00e1ma korl\u00e1tozza.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/f54631d9e8c69f6f70ecace3133ae1e8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDe mi a helyzet a teljes\u00edtm\u00e9nnyel? Kiv\u00e1l\u00f3! K\u00f6r\u00fclbel\u00fcl h\u00e9tszer gyorsabbak vagyunk, mint a legjobb megold\u00e1s a Go-n. Megd\u00f6bbent\u0151, nem?<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/d7e85c933eecb243cfb49225b4d92c6c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDe ezt az implement\u00e1ci\u00f3t ak\u00e1r m\u00e9g gyorsabb\u00e1 lehetne tenni AVX-512, prefetching vagy JIT (just-in-time compiler) haszn\u00e1lat\u00e1val a lek\u00e9rdez\u00e9s \u00fctemez\u0151 sz\u00e1m\u00e1ra. De ez m\u00e1r egy k\u00fcl\u00f6n el\u0151ad\u00e1s t\u00e9m\u00e1ja.<\/p>\n<h2>Bitmap-indexek probl\u00e9m\u00e1i<\/h2>\n<p>\nMost, hogy megvizsg\u00e1ltuk a bitmap-index egyszer\u0171 Go implement\u00e1ci\u00f3j\u00e1t \u00e9s a sokkal teljes\u00edtm\u00e9nyesebb assembly v\u00e1ltozat\u00e1t, v\u00e9gre besz\u00e9lj\u00fcnk arr\u00f3l, hogy mi\u00e9rt haszn\u00e1lj\u00e1k olyan ritk\u00e1n a bitmap-indexeket.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/83d36a5c92ba90fd680fe8afb6cfc11f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nR\u00e9gi tudom\u00e1nyos munk\u00e1k eml\u00edtik a bitmap-indexek h\u00e1rom probl\u00e9m\u00e1j\u00e1t, de \u00fajabb kutat\u00e1sok \u00e9s \u00e9n azt \u00e1ll\u00edtjuk, hogy ezek m\u00e1r elavultak. Nem fogunk m\u00e9lyen belemenni mindegyik probl\u00e9m\u00e1ba, de felsz\u00ednesen \u00e1ttekintj\u00fck azokat.<\/p>\n<h2>A magas kardinalit\u00e1s probl\u00e9m\u00e1ja<\/h2>\n<p>\nTeh\u00e1t azt mondj\u00e1k nek\u00fcnk, hogy a bitmap-indexek csak alacsony kardinalit\u00e1s\u00fa mez\u0151kh\u00f6z alkalmasak, vagyis olyanokhoz, ahol kev\u00e9s \u00e9rt\u00e9k tal\u00e1lhat\u00f3 (p\u00e9ld\u00e1ul nem vagy szemsz\u00edn), \u00e9s ennek az az oka, hogy a szok\u00e1sos reprezent\u00e1ci\u00f3 (egy bit \u00e9rt\u00e9kenk\u00e9nt) nagy kardinalit\u00e1s eset\u00e9n t\u00fal sok helyet foglalna el, \u00e9s emellett ezek a bitmap-indexek alig (ritk\u00e1n) lenn\u00e9nek kit\u00f6ltve.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/0787efc4d2cb4ea4d404ca7888b33697.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/44ab4bc7c25d14fe2f53caf5d9da399d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00e9ha haszn\u00e1lhatunk m\u00e1s reprezent\u00e1ci\u00f3t, p\u00e9ld\u00e1ul a hagyom\u00e1nyosat, amit sz\u00e1mok \u00e1br\u00e1zol\u00e1s\u00e1ra haszn\u00e1lunk. De az algoritmusok t\u00f6m\u00f6r\u00edt\u00e9s\u00e9nek megjelen\u00e9se mindent megv\u00e1ltoztatott. Az elm\u00falt \u00e9vtizedekben tud\u00f3sok \u00e9s kutat\u00f3k sz\u00e1mos t\u00f6m\u00f6r\u00edt\u00e9si algoritmust dolgoztak ki bitmapokhoz. F\u0151 el\u0151ny\u00fck, hogy nem sz\u00fcks\u00e9ges a bitmapokat kicsomagolni bitm\u0171veletek v\u00e9grehajt\u00e1s\u00e1hoz \u2014 a bitm\u0171veleteket k\u00f6zvetlen\u00fcl a t\u00f6m\u00f6r\u00edtett bitmapokon is elv\u00e9gezhetj\u00fck.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/ecb54fbf15aa11271bbbab01ecbda880.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAz ut\u00f3bbi id\u0151ben hibrid megk\u00f6zel\u00edt\u00e9sek is megjelentek, mint p\u00e9ld\u00e1ul a roaring bitmapok. Ezek egyszerre h\u00e1rom k\u00fcl\u00f6nb\u00f6z\u0151 reprezent\u00e1ci\u00f3t haszn\u00e1lnak a bitmapokhoz \u2014 magukat a bitmapokat, t\u00f6mb\u00f6ket \u00e9s az \u00fagynevezett bit runs-t \u2014, \u00e9s egyens\u00falyoznak k\u00f6z\u00f6tt\u00fck a teljes\u00edtm\u00e9ny maximaliz\u00e1l\u00e1sa \u00e9s a mem\u00f3riafogyaszt\u00e1s minimaliz\u00e1l\u00e1sa \u00e9rdek\u00e9ben.<\/p>\n<p>Roaring bitmapokkal a legn\u00e9pszer\u0171bb alkalmaz\u00e1sokban is tal\u00e1lkozhatunk. M\u00e1r l\u00e9tezik hatalmas sz\u00e1m\u00fa implement\u00e1ci\u00f3 a legk\u00fcl\u00f6nb\u00f6z\u0151bb programoz\u00e1si nyelvekhez, t\u00f6bb mint h\u00e1rom implement\u00e1ci\u00f3 p\u00e9ld\u00e1ul Go-hoz is.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/de2adfebc431ff48c996247b453f02ae.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEgy m\u00e1sik megk\u00f6zel\u00edt\u00e9s, amely seg\u00edthet kezelni a nagy kardinalit\u00e1st, a kategoriz\u00e1l\u00e1s (binning) n\u00e9ven ismert. K\u00e9pzelje el, hogy van egy mez\u0151, amely egy szem\u00e9ly magass\u00e1g\u00e1t \u00e1br\u00e1zolja. A magass\u00e1g egy lebeg\u0151pontos sz\u00e1m, de mi, emberek, nem \u00edgy gondolkodunk r\u00f3la. Sz\u00e1munkra nincs k\u00fcl\u00f6nbs\u00e9g a 185,2 cm \u00e9s a 185,3 cm k\u00f6z\u00f6tti magass\u00e1gban.<\/p>\n<p>Ez\u00e9rt csoportos\u00edthatjuk a hasonl\u00f3 \u00e9rt\u00e9keket 1 cm-en bel\u00fcl.<\/p>\n<p>Ha pedig tudjuk, hogy nagyon kev\u00e9s ember van 50 cm-n\u00e9l alacsonyabb vagy 250 cm-n\u00e9l magasabb, akkor l\u00e9nyeg\u00e9ben egy v\u00e9gtelen kardinalit\u00e1s\u00fa mez\u0151t k\u00f6r\u00fclbel\u00fcl 200 \u00e9rt\u00e9k\u0171 mez\u0151v\u00e9 alak\u00edthatunk.<\/p>\n<p>Term\u00e9szetesen, sz\u00fcks\u00e9g eset\u00e9n tov\u00e1bbi sz\u0171r\u00e9st is v\u00e9gezhet\u00fcnk k\u00e9s\u0151bb.<\/p>\n<h2>A nagy s\u00e1vsz\u00e9less\u00e9g probl\u00e9m\u00e1ja<\/h2>\n<p>\nA bitmap-indexek k\u00f6vetkez\u0151 probl\u00e9m\u00e1ja az, hogy a friss\u00edt\u00e9s\u00fck nagyon k\u00f6lts\u00e9ges lehet.<\/p>\n<p>Az adatb\u00e1zisoknak lehet\u0151v\u00e9 kell tenni\u00fck az adatok friss\u00edt\u00e9s\u00e9t abban a pillanatban, amikor potenci\u00e1lisan sz\u00e1z m\u00e1sik k\u00e9r\u00e9s keres ezekben az adatokban. Z\u00e1rakra van sz\u00fcks\u00e9g, hogy elker\u00fclj\u00fck az adatok egyidej\u0171 hozz\u00e1f\u00e9r\u00e9s\u00e9vel kapcsolatos probl\u00e9m\u00e1kat, vagy m\u00e1s megoszt\u00e1si probl\u00e9m\u00e1kat. Ahol egy nagy z\u00e1r van, ott probl\u00e9ma van - a lock contention, amikor ez a z\u00e1r sz\u0171k keresztmetszett\u00e9 v\u00e1lik.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/0ae1bf925542d286f8b7b245c160a35e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEzt a probl\u00e9m\u00e1t shardol\u00e1ssal vagy verzi\u00f3zott indexek haszn\u00e1lat\u00e1val lehet megoldani vagy kiker\u00fclni.<\/p>\n<p>A shardol\u00e1s egyszer\u0171 \u00e9s k\u00f6zismert dolog. A bitmap-indexet ugyan\u00fagy shardolhatja, ahogy b\u00e1rmilyen m\u00e1s adatot. Ahelyett, hogy egy nagy z\u00e1r lenne, sok kis z\u00e1rat kap, \u00edgy megszabadul a lock contention-t\u0151l.<\/p>\n<p>A probl\u00e9ma m\u00e1sodik megold\u00e1sa a verzi\u00f3zott indexek haszn\u00e1lata. Lehet egy m\u00e1solat az indexb\u0151l, amit keres\u00e9sre vagy olvas\u00e1sra haszn\u00e1l, \u00e9s egy m\u00e1sik a \u00edr\u00e1sra vagy friss\u00edt\u00e9sre. \u00c9s egy adott id\u0151k\u00f6z\u00f6nk\u00e9nt (p\u00e9ld\u00e1ul 100 ms vagy 500 ms-onk\u00e9nt) megdupl\u00e1zz\u00e1k \u00e9s felcser\u00e9lik \u0151ket. Nyilv\u00e1nval\u00f3, hogy ez a megk\u00f6zel\u00edt\u00e9s csak akkor alkalmazhat\u00f3, ha az alkalmaz\u00e1sod el tud m\u0171k\u00f6dni egy kiss\u00e9 elmarad\u00f3 keres\u00e9si indexszel.<\/p>\n<p>Ezek a k\u00e9t megk\u00f6zel\u00edt\u00e9s egyidej\u0171leg is haszn\u00e1lhat\u00f3: lehet egy shardolt verzi\u00f3zott indexed.<\/p>\n<h2>Bonyolultabb lek\u00e9rdez\u00e9sek<\/h2>\n<p>A bitmap-indexek utols\u00f3 probl\u00e9m\u00e1ja az, hogy ahogy mondj\u00e1k, nem igaz\u00e1n alkalmasak bonyolultabb k\u00e9rd\u00e9st\u00edpusokhoz, p\u00e9ld\u00e1ul a \"tartom\u00e1ny alapj\u00e1n\" k\u00e9rd\u00e9sekhez.<\/p>\n<p>Val\u00f3ban, ha belegondolunk, a bitm\u0171veletek, mint AND, OR stb. nem igaz\u00e1n alkalmasak olyan k\u00e9rd\u00e9sekre, mint \"Mutasd meg a sz\u00e1llod\u00e1kat, ahol a szoba \u00e1ra 200 \u00e9s 300 doll\u00e1r k\u00f6z\u00f6tt van \u00e9jszak\u00e1nk\u00e9nt\".<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/7bc2e129cad46fb5875c2b3018c39ff7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNaiv \u00e9s nagyon \u00e9sszer\u0171tlen megold\u00e1s lenne az, hogy minden egyes doll\u00e1r\u00e9rt\u00e9khez veszi a tal\u00e1latokat, \u00e9s bitm\u0171velettel, OR-jel \u00f6sszekapcsolja \u0151ket.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/b9f8fc7945caa1866f8e0cfa8a04bd98.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKicsit helyesebb megold\u00e1s lenne a csoportos\u00edt\u00e1s haszn\u00e1lata. P\u00e9ld\u00e1ul 50 doll\u00e1ros csoportokban. Ez 50-szer gyorsabb\u00e1 tenn\u00e9 a folyamatunkat.<\/p>\n<p>De a probl\u00e9ma k\u00f6nnyen megoldhat\u00f3 egy olyan \u00e1br\u00e1zol\u00e1s seg\u00edts\u00e9g\u00e9vel, amelyet kifejezetten az ilyen t\u00edpus\u00fa lek\u00e9rdez\u00e9sekhez k\u00e9sz\u00edtettek. Tudom\u00e1nyos k\u00f6r\u00f6kben ezt tartom\u00e1ny-k\u00f3dolt bitk\u00e9peknek nevezik.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/644a420628b21f220a7af1ff15c4031f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIlyen \u00e1br\u00e1zol\u00e1s eset\u00e9n nem csup\u00e1n egy bitet \u00e1ll\u00edtunk be egy adott \u00e9rt\u00e9khez (p\u00e9ld\u00e1ul 200), hanem ezt az \u00e9rt\u00e9ket \u00e9s mindent, ami magasabb. 200 \u00e9s ann\u00e1l magasabb. Ugyanez vonatkozik a 300-ra: 300 \u00e9s ann\u00e1l magasabb. \u00c9s \u00edgy tov\u00e1bb.<\/p>\n<p>Ezen \u00e1br\u00e1zol\u00e1s seg\u00edts\u00e9g\u00e9vel ilyen t\u00edpus\u00fa keres\u00e9si k\u00e9rd\u00e9sre \u00fagy tudunk v\u00e1laszolni, hogy v\u00e9gigmegy\u00fcnk az indexen mind\u00f6ssze k\u00e9tszer. El\u0151sz\u00f6r megkapjuk a hotelek list\u00e1j\u00e1t, ahol a szoba \u00e1ra kevesebb, mint 300 doll\u00e1r, majd elt\u00e1vol\u00edtjuk bel\u0151le azokat, ahol a szoba \u00e1ra kevesebb, mint 199 doll\u00e1r. K\u00e9sz.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/cc2bb58d7d7a51495c62ec7da81e2d12.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMeg fog lep\u0151dni, de m\u00e9g a geo-lek\u00e9rdez\u00e9sek is lehets\u00e9gesek bitmap-indexek haszn\u00e1lat\u00e1val. A titok abban rejlik, hogy geo\u00e1br\u00e1zol\u00e1st alkalmazunk, amely k\u00f6r\u00fclveszi az \u00d6n koordin\u00e1t\u00e1j\u00e1t egy geometriai form\u00e1val. P\u00e9ld\u00e1ul a Google S2. Az alakzatot h\u00e1rom vagy t\u00f6bb \u00e1tfed\u0151 vonall\u00e1 kell alak\u00edtani, amelyeket sz\u00e1mozni lehet. \u00cdgy a geo-lek\u00e9rdez\u00e9s\u00fcnket t\u00f6bb \"tartom\u00e1ny\" k\u00e9rd\u00e9sre tudjuk \u00e1talak\u00edtani (ezekre a sz\u00e1mozott vonalakra).<\/p>\n<h2>K\u00e9sz megold\u00e1sok<\/h2>\n<p>\nRem\u00e9lem, hogy egy kicsit \u00e9rdekesnek tal\u00e1lta, \u00e9s most egy \u00fajabb hasznos eszk\u00f6z ker\u00fclt a tarsoly\u00e1ba. Ha valaha sz\u00fcks\u00e9ge lenne hasonl\u00f3ra, tudni fogja, hogy melyik ir\u00e1nyba kell n\u00e9znie.<\/p>\n<p>Azonban nem mindenki rendelkezik id\u0151vel, t\u00fcrelemmel \u00e9s er\u0151forr\u00e1sokkal ahhoz, hogy a bitmap-indexeket a null\u00e1r\u00f3l l\u00e9trehozza. K\u00fcl\u00f6n\u00f6sen a fejlettebbek, p\u00e9ld\u00e1ul a SIMD haszn\u00e1lat\u00e1val.<\/p>\n<p>Szerencs\u00e9re van n\u00e9h\u00e1ny k\u00e9sz megold\u00e1s, amelyek seg\u00edtenek \u00d6nnek.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/817b47cb189a758756b602ec9cf319e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Roaring bitk\u00e9pek<\/h2>\n<p>\nEl\u0151sz\u00f6r is, itt van az a roaring bitmaps k\u00f6nyvt\u00e1r, amir\u0151l m\u00e1r besz\u00e9ltem. Tartalmazza az \u00f6sszes sz\u00fcks\u00e9ges kont\u00e9nert \u00e9s bitm\u0171veletet, amelyekre sz\u00fcks\u00e9ge lesz a teljes \u00e9rt\u00e9k\u0171 bitmap-index l\u00e9trehoz\u00e1s\u00e1hoz.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/57f61a51485c174666b52dc2063fabe8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSajnos jelenleg egyetlen Go-implement\u00e1ci\u00f3 sem haszn\u00e1l SIMD-t, ami azt jelenti, hogy a Go-implement\u00e1ci\u00f3k teljes\u00edtm\u00e9nye gyeng\u00e9bb, mint p\u00e9ld\u00e1ul a C szint\u0171 implement\u00e1ci\u00f3k.<\/p>\n<h2>Pilosa<\/h2>\n<p>\nA m\u00e1sik term\u00e9k, amely seg\u00edthet \u00d6nnek, a Pilosa DB, amely l\u00e9nyeg\u00e9ben csak bitmap-indexekkel rendelkezik. Ez egy viszonylag \u00faj megold\u00e1s, de rendk\u00edv\u00fcl gyorsan h\u00f3d\u00edtja meg a sz\u00edveket.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/d3870a979e1e73d093fe5d5e9bb71cd8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA Pilosa bel\u00fcl roaring bitk\u00e9peket haszn\u00e1l, \u00e9s lehet\u0151s\u00e9get biztos\u00edt arra, hogy ezeket haszn\u00e1lja, egyszer\u0171s\u00edti \u00e9s elmagyar\u00e1zza az \u00f6sszes olyan dolgot, amir\u0151l kor\u00e1bban besz\u00e9ltem: csoportos\u00edt\u00e1s, tartom\u00e1ny-k\u00f3dolt bitk\u00e9pek, mez\u0151 fogalma stb.<\/p>\n<p>N\u00e9zz\u00fck meg gyorsan a Pilosa haszn\u00e1lat\u00e1nak p\u00e9ld\u00e1j\u00e1t a m\u00e1r j\u00f3l ismert k\u00e9rd\u00e9s megv\u00e1laszol\u00e1s\u00e1ra.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/dfee7abfd653cc19d9aa8b64c64f3e4e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA p\u00e9lda nagyon hasonl\u00edt arra, amit kor\u00e1bban l\u00e1tt\u00e1l. L\u00e9trehozunk egy Pilosa szerverhez kapcsol\u00f3d\u00f3 klienst, l\u00e9trehozunk egy indexet \u00e9s a sz\u00fcks\u00e9ges mez\u0151ket, majd v\u00e9letlenszer\u0171 adatokkal t\u00f6ltj\u00fck fel a mez\u0151inket, v\u00e9g\u00fcl pedig v\u00e9grehajtjuk a j\u00f3l ismert lek\u00e9rdez\u00e9st.<\/p>\n<p>Ezt k\u00f6vet\u0151en a \u00abdr\u00e1ga\u00bb mez\u0151n NOT-ot haszn\u00e1lunk, majd a tal\u00e1latot (vagy AND-ot) keresztezz\u00fck a \u00abteraszos\u00bb \u00e9s a \u00abfoglal\u00e1sok\u00bb mez\u0151kkel. V\u00e9g\u00fcl megkapjuk a v\u00e9gs\u0151 eredm\u00e9nyt.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/8d66c6d68019c2297b6c15b700f06a3a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNagyon rem\u00e9lem, hogy a k\u00f6zelj\u00f6v\u0151ben a MySQL \u00e9s PostgreSQL adatb\u00e1zisokban is megjelennek ezek az \u00faj t\u00edpus\u00fa indexek \u2014 a bitmap indexek.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/7a8e33d576c7fb6376a173ee038b4206.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Z\u00e1r\u00e1s<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indexek a Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s\" src=\"\/wp-content\/uploads\/2019\/05\/c62caa9ad6f2d96056c80326f4fa9a0d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHa m\u00e9g nem aludt\u00e1l el, k\u00f6sz\u00f6n\u00f6m. Sokan t\u00e9m\u00e1t \u00e9rintettem a korl\u00e1tozott id\u0151keret miatt, de rem\u00e9lem, hogy az el\u0151ad\u00e1s hasznos volt, s\u0151t tal\u00e1n m\u00e9g inspir\u00e1l\u00f3 is.<\/p>\n<p>J\u00f3 tudni a bitmap indexekr\u0151l, m\u00e9g akkor is, ha jelenleg nincs sz\u00fcks\u00e9ged r\u00e1juk. Legyenek m\u00e9g egy eszk\u00f6z az arzen\u00e1lodban.<\/p>\n<p>Megvizsg\u00e1ltunk k\u00fcl\u00f6nb\u00f6z\u0151 tr\u00fckk\u00f6ket a Go teljes\u00edtm\u00e9ny\u00e9nek n\u00f6vel\u00e9s\u00e9re, \u00e9s azokat a dolgokat, amelyekkel a Go ford\u00edt\u00f3ja m\u00e9g nem b\u00e1nik j\u00f3l. Ezt mindenk\u00e9ppen tudnia kell minden Go fejleszt\u0151nek.<\/p>\n<p>Ez minden, amit el akartam mondani. K\u00f6sz\u00f6n\u00f6m!<br \/>\n<br \/>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/451938\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u042f \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u0441 \u044d\u0442\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u043c \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 GopherCon Russia 2019 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435 \u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u2014 \u043d\u0430 \u043c\u0438\u0442\u0430\u043f\u0435 \u0432 \u041d\u0438\u0436\u043d\u0435\u043c \u041d\u043e\u0432\u0433\u043e\u0440\u043e\u0434\u0435. \u0420\u0435\u0447\u044c \u0432 \u043d\u0451\u043c \u0438\u0434\u0451\u0442 \u043e bitmap-\u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u2014 \u043c\u0435\u043d\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u043c, \u0447\u0435\u043c B-tree, \u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c. \u0414\u0435\u043b\u044e\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":25469,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-33793","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u042f \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u0441.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Bitmap-\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432 Go: \u043f\u043e\u0438\u0441\u043a \u043d\u0430 \u0434\u0438\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u042f \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u0441.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:54:42+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:54:42+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Bitmap indexek Go-ban: vad sebess\u00e9g\u0171 keres\u00e9s | ProHoster","description":"Bevezet\u0151 besz\u00e9det tartottam.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Bitmap-\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432 Go: \u043f\u043e\u0438\u0441\u043a \u043d\u0430 \u0434\u0438\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 | ProHoster","og:description":"\u0412\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u042f \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u0441.","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:54:42+00:00","article:modified_time":"2019-10-31T18:54:42+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"33793","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 16:43:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:33:25","updated":"2026-01-21 16:43:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/33793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=33793"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/33793\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/25469"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=33793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=33793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=33793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}