
Eftersom ClickHouse Àr ett specialiserat system Àr det viktigt att beakta dess arkitekturvid anvÀndning. I denna presentation kommer Alexey att tala om exempel pÄ typiska misstag vid anvÀndning av ClickHouse som kan leda till ineffektiv drift. Genom praktiska exempel kommer det att visas hur valet av olika databehandlingsscheman kan förÀndra prestandan avsevÀrt.
Hej alla! Jag heter Alexey och jag jobbar med ClickHouse.

För det första, jag skyndar mig att glĂ€dja er, jag kommer inte att berĂ€tta vad ClickHouse Ă€r idag. Ărligt talat, jag har tröttnat pĂ„ att göra det. Varje gĂ„ng mĂ„ste jag förklara vad det Ă€r. Och jag tror att alla redan vet.

IstÀllet kommer jag att diskutera möjliga fÀllor, det vill sÀga hur man kan anvÀnda ClickHouse felaktigt. Faktum Àr att ni inte behöver vara rÀdda, för vi utvecklar ClickHouse som ett system som Àr enkelt, anvÀndarvÀnligt och fungerar utan problem. Installera och det Àr klart, inga problem.
Men ni mÄste ÀndÄ ta hÀnsyn till att systemet Àr specialiserat och att det Àr lÀtt att stöta pÄ ovanliga anvÀndningsscenarier som kan fÄ systemet att kÀnnas obekvÀmt.
SÄ vilka fÀllor finns det? I huvudsak kommer jag att prata om uppenbara saker. Alla förstÄr allt uppenbart, alla kan glÀdja sig över att de Àr sÄ smarta, och de som inte förstÄr kommer att lÀra sig nÄgot nytt.

Det första och enklaste exemplet, som tyvÀrr ofta intrÀffar, Àr att göra ett stort antal insÀttningar med smÄ batchar, det vill sÀga ett stort antal smÄ insÀttningar.
Om vi ser hur ClickHouse utför insÀttningar, kan ni skicka upp till en terabyte data i ett enda anrop. Det Àr inga problem.
LÄt oss titta pÄ vilken typisk prestanda vi kan förvÀnta oss. Till exempel har vi en tabell med data frÄn Yandex.Metrics. Hits. 105 kolumner. 700 byte i okomprimerad form. Och vi ska göra ordentliga insÀttningar med en miljon rader per batch.
Vi sÀtter in i en MergeTree-tabell, vilket ger oss en halv miljon rader per sekund. UtmÀrkt. I en replikerad tabell blir det lite mindre, cirka 400 000 rader per sekund.
Och om vi aktiverar quorum-insertning fÄr vi lite mindre, men ÀndÄ bra prestanda, 250 000 rader per sekund. Quorum-insertningar Àr en icke-dokumenterad funktion i ClickHouse*.
*frÄn och med 2020, .

Vad hÀnder om man gör det dÄligt? Vi lÀgger in en rad i tabellen MergeTree och fÄr 59 rader per sekund. Det Àr 10 000 gÄnger lÄngsammare. I ReplicatedMergeTree Àr det 6 rader per sekund. Och om quorum aktiveras fÄr vi bara 2 rader per sekund. I min mening Àr det en riktig katastrof. Hur kan man fördröja sÄ? Till och med pÄ min t-shirt stÄr det att ClickHouse inte ska vara segt. Men ÀndÄ hÀnder det ibland.

I sjÀlva verket Àr det vÄr brist. Vi skulle helt kunna fÄ allt att fungera smidigt, men vi gjorde det inte. Och vi gjorde det inte för att det inte var nödvÀndigt för vÄrt scenario. Vi hade redan batchar. Data kom in i batchar, och det var inga problem. Vi lÀgger in och allt fungerar som det ska. Men sjÀlvklart kan olika scenarier uppstÄ. Till exempel, nÀr ni har massor av servrar som genererar data. Och de lÀgger in data inte sÄ ofta, men det blir fortfarande frekventa insÀttningar. Och man mÄste undvika det pÄ nÄgot sÀtt.
Ur teknisk synvinkel Àr poÀngen att nÀr du gör en insert i ClickHouse sÄ hamnar inte datan i nÄgon memtable. Vi har inte ens en Àkta log structure MergeTree, utan bara MergeTree, eftersom det varken finns en logg eller en memTable. Vi skriver helt enkelt in data direkt i filsystemet, redan sorterade i kolumner. Och om du har 100 kolumner mÄste mer Àn 200 filer skrivas till en separat katalog. Allt detta Àr ganska klumpigt.

Och frÄgan uppstÄr: "Hur gör man det rÀtt?" Om situationen Àr sÄdan att man ÀndÄ mÄste skriva data i ClickHouse.
Metod 1. Det hÀr Àr det enklaste sÀttet. AnvÀnd en distribuerad kö. Till exempel, Kafka. Du plockar helt enkelt ut data frÄn Kafka, batchar var sekund. Och allt kommer fungera bra, du skriver in, allt fungerar.
Nackdelarna Àr att Kafka Àr Ànnu ett klumpigt distribuerat system. Jag förstÄr om ni redan har Kafka i ert företag. Det Àr bra, det Àr praktiskt. Men om ni inte har det, bör ni tÀnka er för tre gÄnger innan ni drar in Ànnu ett distribuerat system i ert projekt. Och dÀrför bör ni övervÀga alternativ.

Metod 2. HÀr Àr ett gammaldags alternativ som ÀndÄ Àr mycket enkelt. Har du en server som genererar dina loggar? Den skriver helt enkelt dina loggar i en fil. Och en gÄng per sekund, till exempel, byter vi namn pÄ filen och öppnar en ny. En separat skript, antingen via cron eller nÄgon daemon, tar den Àldsta filen och skriver den till ClickHouse. Om loggar skrivs en gÄng per sekund kommer allt att bli utmÀrkt.
Men nackdelen med denna metod Àr att om din server, dÀr loggarna genereras, plötsligt försvinner, sÄ försvinner ocksÄ datan.

Metod 3. Det finns en annan intressant metod som helt saknar temporÀra filer. Antag att du har nÄgon slags reklamshub eller en annan intressant daemon som genererar data. Du kan lagra en bunt data direkt i RAM-minnet, i bufferten. NÀr tillrÀckligt med tid har gÄtt, lÀgger du denna buffer pÄ sidan, skapar en ny, och i en separat trÄd infogar du det som redan har samlats in till ClickHouse.
à andra sidan försvinner Àven data om du exekverar kill -9. Om din server kraschar, förlorar du dessa data. Ytterligare ett problem Àr att om du inte kan skriva till databasen kommer data att samlas kvar i RAM-minnet. Antingen tar RAM-minnet slut, eller sÄ förlorar du bara datan.

Metod 4. Ănnu en intressant metod. Du har en serverprocess som kan skicka data till ClickHouse direkt, men gör det i en enda anslutning. Till exempel, du skickar en http-förfrĂ„gan med transfer-encoding: chunked med en insert. Och den genererar chunkar inte allt för sĂ€llan; du kan skicka varje rad, Ă€ven om det kommer att finnas overhead för ramverket av dessa data.
Men likvÀl kommer data i detta fall att skickas till ClickHouse direkt. Och ClickHouse kommer att buffra dem sjÀlv.
Men problem uppstÄr ocksÄ. Nu kommer du att förlora data, sÀrskilt nÀr din process avslutas, och om ClickHouse-processen dödas, eftersom det kommer att bli en ofullstÀndig insert. I ClickHouse Àr inserts atomÀra upp till en viss angiven tröskel av rader. I princip Àr detta en intressant metod. Kan ocksÄ anvÀndas.

Metod 5. HĂ€r Ă€r Ă€nnu ett intressant sĂ€tt. Det Ă€r ett community-utvecklat server för databatching. Jag har inte tittat pĂ„ det sjĂ€lv, sĂ„ jag kan inget garantera. Dock, inga garantier ges heller för ClickHouse. Detta Ă€r ocksĂ„ open source, men Ă„ andra sidan kan du vara van vid en viss standard av kvalitet som vi försöker tillhandahĂ„lla. För denna grej â jag vet inte, gĂ„ in pĂ„ GitHub, kolla koden. Kanske har de skrivit nĂ„got bra.
* per 2020, bör Àven beaktas .

Metod 6. Ett annat sÀtt Àr att anvÀnda buffer-tabeller. Fördelen med detta sÀtt Àr att det Àr vÀldigt enkelt att börja anvÀnda. Du skapar en buffer-tabell och sÀtter in data i den.
Men nackdelen Àr att problemet inte löses helt. Om vid insÀttning av typ MergeTree mÄste du gruppera data till en batch per sekund, sÄ mÄste du vid insÀttning i buffer-tabellen gruppera till Ätminstone flera tusen per sekund. Om det överstiger 10 000 per sekund, kommer det fortfarande att bli dÄligt. Om du sÀtter in i batchar, sÄ har du sett att det kan bli hundratusentals rader per sekund. Och det Àr redan med ganska tunga data.
Och buffer-tabeller har inte heller nÄgon logg. Och om det Àr nÄgot fel med din server, sÄ kommer data att gÄ förlorade.

Och som en bonus har vi nyligen fĂ„tt möjligheten att hĂ€mta data frĂ„n Kafka i ClickHouse. Det finns en tabellmotor â Kafka. Du skapar helt enkelt en och kan koppla materialiserade vyer till den. I sĂ„ fall kommer den sjĂ€lv att hĂ€mta data frĂ„n Kafka och sĂ€tta in i de tabeller du behöver.
Och det som glÀder mig sÀrskilt med denna funktion Àr att det inte Àr vi som har gjort den. Det Àr en community-funktion. Och nÀr jag sÀger "community-funktion", sÀger jag det utan förakt. Vi har lÀst koden, gjort granskningar, det ska fungera bra.
* per 2020, har liknande stöd tillkommit för .

Vad kan vara obekvĂ€mt eller ovĂ€ntat vid datainmatning? Om du gör en insert values-förfrĂ„gan och skriver nĂ„gra berĂ€knade uttryck i values. Till exempel, now() â det Ă€r ocksĂ„ ett berĂ€knat uttryck. I det fallet mĂ„ste ClickHouse köra tolkaren för dessa uttryck för varje rad, och prestandan kommer att sjunka drastiskt. BĂ€st Ă€r att undvika detta.
* för tillfÀllet Àr problemet helt löst, det finns ingen regressionsprestanda vid anvÀndning av uttryck i VALUES lÀngre.
Ett annat exempel pÄ nÀr det kan finnas vissa problem Àr nÀr du har data i en batch som tillhör flera partitioner. Som standard Àr partitionerna i ClickHouse per mÄnad. Om du infogar en batch med en miljon rader och data strÀcker sig över flera Är, sÄ kommer du att ha flera tiotals partitioner. Det Àr likvÀrdigt med att ha batcher med flera tiotals gÄnger mindre storlek, eftersom de alltid först bryts ner efter partitionerna.
* nyligen har ClickHouse i experimentellt lÀge fÄtt stöd för kompakt format av block och block i minnet med en write-ahead log, vilket nÀstan helt löser problemet.

LĂ„t oss nu titta pĂ„ den andra typen av problem â datatypning.
Datatypning kan vara strikt eller strÀngtyp. StrÀngtyp Àr nÀr du helt enkelt har deklarerat att alla dina fÀlt Àr av typ string. Det Àr dÄligt. Man ska inte göra sÄ.
LÄt oss förstÄ hur man gör det rÀtt i situationer dÀr man vill sÀga att ett visst fÀlt Àr en strÀng och lÄta ClickHouse sjÀlv hantera det, utan att jag behöver oroa mig. Men det Àr ÀndÄ vÀrt att anstrÀnga sig lite.

Till exempel har vi en IP-adress. I ett fall har vi sparat den som en strÀng, till exempel 192.168.1.1. I det andra fallet kommer det att vara ett tal av typen UInt32*. 32 bitar Àr tillrÀckligt för en IPv4-adress.
Först och frÀmst, som inte Àr överraskande, kommer data att komprimeras ungefÀr lika mycket. Det kommer att bli skillnader, förstÄs, men inte sÄ stora. SÄ det finns inga speciella problem med disk I/O.
Men det finns en betydande skillnad i CPU-tid och frÄgaexekveringstid.
LÄt oss rÀkna antalet unika IP-adresser om de lagras som tal. Det blir 137 miljoner rader per sekund. Om samma sak görs som strÀngar, blir det 37 miljoner rader per sekund. Jag vet inte varför sÄdana överensstÀmmelser har uppstÄtt. Jag har sjÀlv kört dessa frÄgor. Men ÀndÄ Àr det ungefÀr fyra gÄnger lÄngsammare.
Och om vi berÀknar skillnaden i lagringsutrymme pÄ disken, finns det ocksÄ skillnader. Och skillnaden Àr nÄgonstans runt en fjÀrdedel, eftersom det finns tillrÀckligt mÄnga unika IP-adresser. Och om det hÀr var strÀngar med ett litet antal olika vÀrden, skulle de enkelt komprimeras med hjÀlp av en ordbok till ungefÀr samma volym.
Och det Àr en fyrdubbel tidsdifferens pÄ vÀgen som inte ligger och vÀntar. Kanske bryr du dig inte, men nÀr jag ser en sÄdan skillnad blir jag ledsen.

LÄt oss titta pÄ olika fall.
1. Ett fall dÀr ni har ett par unika vÀrden. I det hÀr fallet anvÀnder vi en enkel praxis som ni kanske kÀnner till och kan anvÀnda för alla databas-system. Det gÀller inte bara ClickHouse. Ni skriver helt enkelt in numeriska identifierare i databasen. Att konvertera till strÀngar och tillbaka kan göras pÄ applikationssidan.
Tills exempel, ni har en region. Och ni försöker spara den som en strÀng. Om ni skriver: Moskva och MO. NÀr jag ser att det stÄr "Moskva", Àr det okej, men nÀr ocksÄ MO stÄr dÀr, blir det verkligen sorgligt. Det Àr sÄ mÄnga byte.
IstÀllet skriver vi helt enkelt in ett Ulnt32-nummer och 250. Vi har 250 i Yandex, men ni kanske har nÄgot annat. För sÀkerhets skull nÀmner jag att ClickHouse har inbyggt stöd för geodatabaser. Ni skriver helt enkelt en katalog med regioner, inklusive hierarkiska, det vill sÀga den kommer att omfatta bÄde Moskva och MO, samt allt annat ni behöver. Och det gÄr att konvertera pÄ frÄgenivÄ.

Det andra alternativet Àr ungefÀr detsamma, men redan med stöd inuti ClickHouse. Det Àr datatypen Enum. Inom Enum angiver ni helt enkelt alla nödvÀndiga vÀrden. Till exempel enhetstypen dÀr ni skriver: dator, mobil, surfplatta, tv. Totalt fyra alternativ.
En nackdel Àr att man periodvis mÄste Àndra. Man har bara lagt till ett alternativ. Gör en Àndring av tabellen. Faktum Àr att Àndringen av tabellen i ClickHouse Àr kostnadsfri. SÀrskilt kostnadsfri för Enum, eftersom data pÄ disken inte förÀndras. Men ÀndÄ, Àndringen tar blockering* pÄ tabellen och mÄste vÀnta tills alla selects utförs. Och först efter det genomförs Àndringen, det finns ÀndÄ vissa olÀgenheter.
* I de senaste versionerna av ClickHouse Àr ALTER helt icke-blockerande.

Ett annat alternativ som Àr ganska unikt för ClickHouse Àr anslutning av externa ordböcker. Ni kan skriva in siffror i ClickHouse, medan era kataloger kan hÄllas i vilket system som helst som Àr bekvÀmt för er. Till exempel kan ni anvÀnda: MySQL, Mongo, Postgres. Ni kan till och med skapa er egen mikrotjÀnst som via http kommer att tillhandahÄlla dessa data. Och pÄ ClickHouse-nivÄn skriver ni en funktion som omvandlar dessa data frÄn siffror till strÀngar.
Det hÀr Àr ett specialiserat men mycket effektivt sÀtt att utföra en join med en utomstÄende tabell. Det finns dessutom tvÄ alternativ. I det ena alternativet kommer dessa data att vara helt cachade, helt nÀrvarande i minnet och uppdateras med viss periodicitet. I det andra alternativet, om dessa data inte fÄr plats i minnet, gÄr det att cachera dem delvis.
HÀr Àr ett exempel. Det finns Yandex.Direct. Och dÀr finns det reklamkampanjer och annonser. Det finns nog cirka tio miljoner reklamkampanjer. Och de fÄr plats i minnet. Men det finns miljarder annonser, de fÄr inte plats. Och vi anvÀnder en cachad ordbok frÄn MySQL.
Det enda problemet Àr att den cachade ordboken fungerar normalt om hit rate ligger nÀra 100 %. Om den Àr lÀgre mÄste vi vid behandling av förfrÄgningar för varje datamÀngd faktiskt hÀmta de saknade nycklarna och hÀmta data frÄn MySQL. Jag kan fortfarande garantera att ClickHouse inte saktar ner, men jag ska inte prata om andra system.
Som en bonus Àr ordböcker ett mycket enkelt sÀtt att uppdatera data i ClickHouse i efterhand. Det vill sÀga, om du hade en rapport om reklamkampanjer och anvÀndaren bara Àndrade reklamkampanjen, sÄ skulle Àven alla tidigare data och rapporter uppdateras. Om du skriver rader direkt i tabellen kommer det att vara omöjligt att uppdatera dem.

Ett annat sÀtt, nÀr du inte vet hur du ska fÄ identifierare för dina rader, Àr att helt enkelt hasha. Det enklaste alternativet Àr att ta en 64-bitars hash.
Det enda problemet Àr att om hashen Àr 64-bit Àr kollisioner nÀstan garanterade. Eftersom om det finns en miljard rader blir sannolikheten mÀrkbar.
Och det vore inte sÄ bra att hashera namnen pÄ reklamkampanjer pÄ det sÀttet. Om reklamkampanjer frÄn olika företag blandas ihop kommer det att bli nÄgot oklart.
Och det finns ett enkelt knep. Visserligen passar det inte sÄ bra för seriösa data, men om det Àr nÄgot som inte Àr sÄ allvarligt, sÄ lÀgg bara till klientens identifierare i nyckeln i ordboken. DÄ kommer du att ha kollisioner, men bara inom en och samma klient. Den hÀr metoden anvÀnds för vÄr lÀnk-karta i Yandex.Metrica. Vi har dÀr URLs, vi lagrar hashar. Och vi vet att det finns kollisioner, sjÀlvklart. Men nÀr sidan visas, Àr sannolikheten för att just pÄ en och samma sida en anvÀndare har nÄgot URL som krockar och att nÄgon verkligen upptÀcker det, sÄ kan man bortse frÄn det.
Som en bonus â för mĂ„nga operationer rĂ€cker det med bara hashar och sjĂ€lva strĂ€ngarna behöver inte lagras nĂ„gonstans.

Ett annat exempel Ă€r om strĂ€ngarna Ă€r korta, till exempel domĂ€nnamn. De kan lagras som de Ă€r. Eller till exempel sprĂ„k i webblĂ€saren ru â 2 byte. SjĂ€lvklart, jag Ă€r vĂ€ldigt rĂ€dd om byte, men oroa dig inte, 2 byte gör inget. SnĂ€lla, lagra dem som de Ă€r, sköt dig inte.

Ett annat tillfÀlle Àr nÀr det finns vÀldigt mÄnga strÀngar och de dessutom innehÄller mÄnga unika via mÀngder som potentiellt Àr oÀndliga. Ett typiskt exempel Àr sökord eller URLs. Sökord, bland annat pÄ grund av stavfel. LÄt oss se hur mÄnga unika sökord det finns per dag. Det visar sig att de nÀstan utgör hÀlften av alla hÀndelser. Och i det hÀr fallet skulle du kunna tÀnka att det behövs normalisering av data, att rÀkna identifierare och lagra i en separat tabell. Men det behöver du inte göra. Lagra helt enkelt dessa strÀngar som de Àr.
BĂ€ttre â hitta pĂ„ inget, för om du lagrar dem separat, sĂ„ kommer det att krĂ€vas join. Och denna join â Ă€r i bĂ€sta fall en slumpmĂ€ssig Ă„tkomst i minnet, om det ens kan fĂ„ plats i minnet. Om det inte fĂ„r plats, kommer det att bli problem.
Och om data lagras in place, sÄ lÀses de helt enkelt ut i rÀtt ordning frÄn filsystemet och allt Àr bra.

Om du har URLs eller nÄgon annan komplicerad lÄng strÀng, sÄ bör du tÀnka pÄ att du kanske kan berÀkna en sammanfattning i förvÀg och skriva den i en separat kolumn.
För URLs, till exempel, kan du lagra domÀnen separat. Och om du verkligen behöver domÀnen, sÄ anvÀnd bara den kolumnen, medan URLs kommer att ligga kvar, och du kommer inte ens röra dem.
LÄt oss titta pÄ vilken skillnad det blir. I ClickHouse finns det en specialiserad funktion som berÀknar domÀnen. Den Àr vÀldigt snabb, vi har optimerat den. Och Àrligt talat, den följer inte ens RFC, men den berÀknar allt vi behöver.
Och i det ena fallet kommer vi bara att hÀmta URL:er och berÀkna domÀnen. Det tar 166 millisekunder. Men om vi tar en fÀrdig domÀn, blir det bara 67 millisekunder, det vill sÀga nÀstan tre gÄnger snabbare. Dessutom Àr det inte snabbare för att vi behöver göra nÄgra berÀkningar, utan för att vi lÀser mindre data.
Av nÄgon anledning visar det sig att en av förfrÄgningarna, som Àr lÄngsammare, har högre hastighet i gigabyte per sekund. Eftersom den lÀser mer gigabyte. Det Àr helt onödiga data. FörfrÄgningen fungerar snabbare, men tar lÀngre tid.
Om vi tittar pÄ datamÀngden pÄ disken visar det sig att URL:en Àr 126 megabyte och domÀnen bara 5 megabyte. Det Àr 25 gÄnger mindre. Men ÀndÄ utförs förfrÄgningen bara 4 gÄnger snabbare. Men det beror pÄ att data Àr heta. Om de vore kalla skulle det sÀkert vara 25 gÄnger snabbare pÄ grund av disk-I/O.
Förresten, om vi bedömer hur mycket mindre domÀnen Àr Àn URL:en, sÄ Àr det cirka 4 gÄnger. Men av nÄgon anledning tar data pÄ disken 25 gÄnger mindre. Varför? PÄ grund av komprimering. BÄde URL:en och domÀnen komprimeras. Men ofta innehÄller URL:en massor av skrÀp.

Och sjÀlvklart Àr det viktigt att anvÀnda rÀtt datatyper som Àr specifikt avsedda för de nödvÀndiga vÀrdena, eller som passar. Om du har IPv4, lagra UInt32*. Om det Àr IPv6, anvÀnd FixedString(16), eftersom IPv6-adressen Àr 128 bitar, det vill sÀga lagra den direkt i binÀrt format.
Vad ska man göra om du ibland har IPv4-adresser och ibland IPv6? Ja, du kan lagra bÄda. En kolumn för IPv4, en annan för IPv6. Naturligtvis finns det en möjlighet att visa IPv4 i IPv6. Det kommer ocksÄ att fungera, men om du ofta behöver IPv4-adressen i dina förfrÄgningar, sÄ Àr det bra att lÀgga den i en separat kolumn.
* nu finns det separata datatyper för IPv4 och IPv6 i ClickHouse, som lagrar data lika effektivt som siffror, men presenterar dem pÄ ett bekvÀmt sÀtt som strÀngar.

Det Àr ocksÄ viktigt att notera att man bör förbehandla data i förvÀg. Till exempel, om det kommer rÄa loggar till er. Och kanske bör ni inte bara stoppa in dem i ClickHouse, Àven om det Àr frestande att inte göra nÄgot och allt kommer att fungera. Men det Àr ÀndÄ vÀrt att utföra de berÀkningar som gÄr.
Till exempel, webblÀsarversionen. I en viss nÀrliggande avdelning, som jag inte vill peka ut, lagras webblÀsarversionen pÄ detta sÀtt, dvs. som en strÀng: 12.3. Sedan, för att göra en rapport, delar de denna strÀng pÄ en array, och sedan pÄ det första elementet i arrayen. Givetvis saktar allt ner. Jag frÄgade dem varför de gör sÄ. De svarade att de inte gillar för tidig optimering. Men jag gillar inte för tidig pessimering.
SÄ i detta fall Àr det mer korrekt att dela upp i 4 kolumner. Var inte rÀdd, eftersom detta Àr ClickHouse. ClickHouse Àr en kolumnbaserad databas. Och ju fler noggrant smÄ kolumner, desto bÀttre. Har ni 5 BrowserVersion, gör 5 kolumner. Det Àr normalt.

Nu ska vi övervÀga vad man ska göra om ni har mÄnga mycket lÄnga strÀngar, mycket lÄnga arrayer. Dessa behöver inte lagras i ClickHouse överhuvudtaget. IstÀllet kan ni spara endast nÄgot slags identifierare i ClickHouse. Dessa lÄnga strÀngar kan ni lagra i nÄgot annat system.
Till exempel, i en av vÄra analytiska tjÀnster finns det vissa hÀndelseparametrar. Och om mÄnga parametrar kommer med hÀndelserna, sparar vi bara de första 512 som kommer. Eftersom 512 Àr inte nÄgot att sörja över.

Och om ni inte kan bestÀmma era datatyper, kan ni ocksÄ skriva data till ClickHouse, men i en temporÀr tabell av typen Log, speciellt för temporÀra data. Efter detta kan ni analysera vilken vÀrdefördelning ni har, vad som överhuvudtaget finns och sammansÀtta korrekta typer.
* just nu finns det en datatyp i ClickHouse som gör det möjligt att effektivt lagra strÀngar med mindre arbetsinsats.

Nu ska vi övervÀga ett annat intressant fall. Ibland fungerar allt mÀrkligt för folk. Jag gÄr in och ser nÄgot som detta. Och det ger omedelbart intrycket att det gjordes av en mycket erfaren, smart administratör med stor erfarenhet av att konfigurera MySQL version 3.23.
HÀr ser vi tusen tabeller, dÀr var och en lagrar restvÀrdet av en oklar division pÄ tusen.
I princip respekterar jag andras erfarenheter, inklusive att jag förstÄr vilka svÄrigheter som kan ligga bakom dessa erfarenheter.

Och orsakerna Àr mer eller mindre förstÄeliga. Det handlar om gamla stereotyper som kan ha samlats vid arbete med andra system. Till exempel finns det inget klusterprimÀrt nyckel i MyISAM-tabeller. Och detta sÀtt att dela upp data kan vara ett desperat försök att fÄ samma funktionalitet.
En annan orsak Ă€r att det Ă€r svĂ„rt att utföra operationer som alter pĂ„ stora tabeller. Allt kommer att blockeras. Ăven om detta problem inte lĂ€ngre Ă€r sĂ„ allvarligt i moderna versioner av MySQL.
Eller till exempel mikroskarding, men det kommer vi tillbaka till senare.

I ClickHouse behöver man inte göra pÄ det sÀttet, för först och frÀmst Àr den primÀra nyckeln klusterbaserad, och data Àr ordnad efter den primÀra nyckeln.
Och ibland frÄgar folk mig: "Hur pÄverkas prestandan av intervallsökningar i ClickHouse av storleken pÄ tabellen?". Jag sÀger att det inte pÄverkas alls. Till exempel, om ni har en tabell med en miljard rader och lÀser ett intervall pÄ en miljon rader, fungerar det bra. Om tabellen har en triljon rader och ni lÀser en miljon rader, kommer det att vara nÀstan samma sak.
Och för det andra behövs inga manövrar som manuella partitioner. Om du gÄr in och tittar pÄ filsystemet, kommer du att se att tabellen Àr en ganska komplex struktur. Inuti finns det nÄgot som liknar partitioner. Det vill sÀga, ClickHouse gör allt Ät dig och du behöver inte lida.

Alter i ClickHouse Àr gratis, om man gör alter add/drop column.
Och det Àr inte vÀrt att skapa smÄ tabeller, för om din tabell har 10 rader eller 10 000 rader spelar det ingen roll. ClickHouse Àr ett system som optimerar genomflödet, inte latensen, sÄ att bearbeta 10 rader Àr meningslöst.

Det Àr rÀtt att anvÀnda en stor tabell. SlÀpp de gamla stereotyperna, sÄ blir allt bra.
Som en bonus har vi i den senaste versionen fÄtt möjligheten att skapa godtyckliga partitionsnycklar för att kunna utföra olika underhÄllsoperationer pÄ individuella partitioner.
Till exempel om du behöver mĂ„nga smĂ„ tabeller, som nĂ€r det finns ett behov av att bearbeta vissa mellanliggande data, fĂ„r du hitta chunkar och du behöver utföra transformationer pĂ„ dem innan de skrivs till den slutliga tabellen. För detta fall finns det en fantastisk tabellmotor â StripeLog. Det Ă€r ungefĂ€r som TinyLog, fast bĂ€ttre.
* just nu finns det Àven .

En annan antipattern Àr mikrosplittring. Till exempel, om du behöver shardera data och du har 5 servrar, men imorgon kommer det att vara 6 servrar. Och du undrar hur du ska ombalansera dessa data. IstÀllet för att splittra det i 5 shards, splittrar du det i 1 000 shards. Och sedan mappar du varje av dessa mikrosplitter till en separat server. Och du kan fÄ 200 ClickHouse pÄ en server, till exempel. Separata instanser pÄ olika portar eller separata databaser.

Men i ClickHouse Ă€r detta inte sĂ€rskilt bra. För Ă€ven en instans av ClickHouse strĂ€var efter att anvĂ€nda alla tillgĂ€ngliga resurser pĂ„ servern för att bearbeta en enda frĂ„ga. Det vill sĂ€ga, om du har en server som har 56 processorerkĂ€rnor. Du utför en frĂ„ga som tar en sekund, och den kommer att anvĂ€nda 56 kĂ€rnor. Om du har 200 ClickHouse-instans pĂ„ en och samma server, kommer det att resultera i att 10 000 trĂ„dar startas. Ăverlag kommer det att gĂ„ vĂ€ldigt dĂ„ligt.
En annan anledning Àr att arbetsfördelningen mellan dessa instanser kommer att vara ojÀmn. NÄgon kommer att avsluta tidigare, nÄgon senare. Om allt skulle ske i en enda instans, skulle ClickHouse sjÀlv kunna avgöra hur man ska fördela data pÄ rÀtt sÀtt mellan trÄdarna.
Och en ytterligare anledning Àr att du kommer att ha interprocesskommunikation över TCP. Data mÄste serialiseras, deserialiseras och det Àr en enorm mÀngd mikrosplitter. Det kommer helt enkelt att fungera ineffektivt.

Ănnu en antipattern, Ă€ven om det Ă€r svĂ„rt att kalla det en antipattern. Det Ă€r ett stort antal föraggregat.
Generellt sett Àr föraggregation bra. Om du hade en miljard rader, aggregara du dem och det blir 1 000 rader, och nu utförs frÄgan omedelbart. Allt Àr fantastiskt. SÄ kan man göra. Och för detta finns det till och med en speciell typ av tabell i ClickHouse, AggregatingMergeTree, som gör inkrementell aggregation medan data sÀtts in.
Det finns dock fall dÀr man tÀnker att vi ska aggreggera data pÄ det hÀr sÀttet och sedan pÄ ett annat. I en viss nÀrliggande avdelning, som jag helst inte vill nÀmna, anvÀnder man SummingMergeTree-tabeller för att summera efter primÀrnyckeln, och som primÀrnyckel anvÀnder man drygt 20 olika kolumner. Jag har av sÀkerhetsskÀl Àndrat namnen pÄ nÄgra kolumner för att vara diskret, men i stort sett Àr det sÄ.

Och dÄ uppstÄr sÄdana problem. För det första minskar inte datavolymen sÀrskilt mycket. Till exempel, den minskar med tre gÄnger. Tre gÄnger skulle vara ett bra pris för att kunna ha obegrÀnsade möjligheter för analys, vilket Àr fallet om dina data inte Àr aggregerade. Om datan Àr aggregerad fÄr du istÀllet bara usel statistik.
Och vad Àr sÀrskilt frustrerande? Det Àr att dessa personer frÄn den nÀrliggande avdelningen kommer och ber om att fÄ lÀgga till en kolumn i primÀrnyckeln. Det vill sÀga, vi har aggreggerat data pÄ det hÀr sÀttet, men nu vill vi ha lite mer. Men i ClickHouse finns det ingen möjlighet att Àndra primÀrnyckeln. DÀrför mÄste man skriva nÄgot skript i C++. Och jag gillar inte skript, Àven om de Àr i C++.
Och om man ser pĂ„ varför ClickHouse skapades, sĂ„ Ă€r det just för att hantera icke-aggregerade data â det Ă€r det scenario för vilket det Ă€r fött. Om du anvĂ€nder ClickHouse för icke-aggregerade data gör du helt rĂ€tt. Om du aggregerar Ă€r det ibland förlĂ„tligt.

Ett ytterligare intressant fall Àr frÄgor i en oÀndlig loop. Jag gÄr ibland in pÄ nÄgon produktionsserver och kollar pÄ show processlist. Och varje gÄng upptÀcker jag att nÄgot hemskt pÄgÄr.
Till exempel nÄgot av detta slag. HÀr blir det genast tydligt att man kunde ha genomfört allt med en enda frÄga. Skriv bara url in och lista.

Varför Àr det dÄligt med mÄnga sÄdana frÄgor i en oÀndlig loop? Om indexet inte anvÀnds kommer det att bli mÄnga genomgÄngar av samma data. Men om indexet anvÀnds, till exempel om du har en primÀrnyckel pÄ ru och skriver url = nÄgot dÀr. DÄ tror du att det kommer att lÀsas in exakt ett url frÄn tabellen, och allt kommer att vara bra. Men i sjÀlva verket Àr det inte sÄ. För ClickHouse arbetar alltid med batchar.
NÀr den behöver lÀsa ett dataintervall lÀser den lite mer eftersom indexet i ClickHouse Àr glest. Det hÀr indexet tillÄter inte att hitta enskilda rader i tabellen, bara vissa intervall. Och data komprimeras i block. För att lÀsa en rad mÄste man hÀmta ett helt block och dekomprimera det. Om du gör mÄnga förfrÄgningar kommer du att ha mÄnga överlappningar, och mycket av arbetet kommer att utföras om och om igen.

Som en bonus kan man notera att man i ClickHouse inte behöver vara rÀdd för att skicka Àven megabyte och till och med hundratals megabyte i IN-sektionen. Jag minns frÄn vÄr praxis att om vi skickar massor av vÀrden i IN-sektionen i MySQL, till exempel 100 megabyte av vissa nummer, sÄ Àter MySQL upp 10 gigabyte minne och sedan hÀnder det inget mer, allt fungerar dÄligt.
Det andra Àr att i ClickHouse, om dina förfrÄgningar anvÀnder index, sÄ Àr det alltid inte lÄngsammare Àn en fullstÀndig skanning, det vill sÀga om nÀstan hela tabellen mÄste lÀsas, kommer den att gÄ sekventiellt och lÀsa hela tabellen. I allmÀnhet hanterar den sig sjÀlv.
Men det finns ÀndÄ vissa svÄrigheter. Till exempel anvÀnds inte indexet med subfrÄgor i IN. Men det Àr vÄrt problem och vi mÄste ÄtgÀrda det. Det finns inget fundamentalt hÀr. Vi kommer att fixa det.
En annan intressant sak Àr att om du har en mycket lÄng förfrÄgning och den distribuerade behandlingen av förfrÄgningar pÄgÄr, sÄ kommer den hÀr mycket lÄnga förfrÄgningen att skickas till varje server utan komprimering. Till exempel, 100 megabyte och 500 servrar. Och dÀrför kommer 50 gigabyte att överföras över nÀtverket. Det kommer att skickas och sedan kommer allt att utföras framgÄngsrikt.
* redan anvÀnds; allt Àr fixat, som lovat.

Och det Àr ganska vanligt att förfrÄgningar kommer frÄn API. Till exempel har du skapat en egen tjÀnst. Och om din tjÀnst behövs av nÄgon, öppnar du ett API och redan bokstavligt talat tvÄ dagar senare ser du att nÄgot konstigt hÀnder. Allt Àr överbelastat och det kommer fruktansvÀrda förfrÄgningar som aldrig borde ha kommit.
Och lösningen hÀr Àr enkel. Om du har öppnat ett API, sÄ mÄste du begrÀnsa det. Till exempel införa kvoter. Det finns inga andra normala alternativ. Annars kommer nÄgon att skriva ett skript och det kommer att bli problem.
I ClickHouse finns det en speciell funktion â kvotberĂ€kning. Du kan Ă€ven ange din egen kvotnyckel, som till exempel en intern anvĂ€ndaridentifikator. Kvoterna rĂ€knas oberoende för var och en av dem.

Nu kommer vi till en intressant sak till. Det handlar om manuell replikering.
Jag kÀnner till mÄnga fall dÀr, trots att ClickHouse har inbyggt stöd för replikering, mÀnniskor repeterar ClickHouse manuellt.
Hur fungerar det? Du har en databehandlingspipeline som arbetar oberoende, till exempel i olika datacenter. Du skriver identiska data pÄ ett identiskt sÀtt till ClickHouse. Men i praktiken visar det sig att data ÀndÄ kommer att skingras pÄ grund av vissa egenskaper i din kod, vilket jag hoppas inte gÀller för din.
Och du kommer ÀndÄ att behöva synkronisera manuellt periodiskt. Till exempel gör administratörer en rsync en gÄng i mÄnaden.
Det Àr faktiskt mycket enklare att anvÀnda den inbyggda replikeringen i ClickHouse. Men det kan finnas vissa nackdelar, eftersom det krÀver att du anvÀnder ZooKeeper. Jag tÀnker inte tala illa om ZooKeeper; i grunden Àr systemet fungerande, men ibland anvÀnder folk det inte pÄ grund av rÀdslan för Java, eftersom ClickHouse Àr ett sÄ bra system skrivet i C++ som fungerar utmÀrkt. Men ZooKeeper Àr pÄ Java. Och det kÀnns som man helst vill undvika det, men dÄ kan du anvÀnda manuell replikation.

ClickHouse Àr ett praktiskt system. Det tar hÀnsyn till dina behov. Om du har manuell replikation kan du skapa en distribuerad tabell som tittar pÄ dina manuella repliker och sjÀlv gör failover mellan dem. Det finns till och med ett speciellt alternativ för att undvika flap, Àven om dina repliker konsekvent skingras.

Det kan uppstÄ problem om du anvÀnder primitiva tabellmotorer. ClickHouse Àr en slags byggsats med massor av olika tabellmotorer. För alla seriösa fall, som beskrivs i dokumentationen, rekommenderas det att anvÀnda tabeller frÄn MergeTree-familjen. De andra Àr mer för speciella fall eller tester.
I MergeTree-tabellen behöver du inte nödvÀndigtvis ha nÄgot datum eller tid. Du kan ÀndÄ anvÀnda det. Om det inte finns nÄgot datum och tid, kan du sÀtta att standarden Àr 2000, sÄ kommer det att fungera och inte krÀva nÄgra resurser.
I den nya versionen av servern kan du Àven specificera att du vill ha anpassad partitionering utan partitionsnyckel. Det kommer att vara detsamma.

à andra sidan kan du anvÀnda primitiva tabellmotorer. Till exempel kan du ladda data en gÄng och sedan utforska, manipulera och radera. Du kan anvÀnda Log.
Eller lagra smĂ„ mĂ€ngder för mellanbearbetning â detta Ă€r StripeLog eller TinyLog.
Memory kan anvÀndas om datavolymen Àr liten och du bara vill manipulera nÄgot i RAM.

ClickHouse gillar inte övernormaliserade data sÀrskilt mycket.
HÀr Àr ett typiskt exempel. Det Àr en stor mÀngd URL:er. Du har lagt dem i en nÀrliggande tabell. Och sedan beslutade du att göra en JOIN med dem, men det kommer vanligtvis inte att fungera eftersom ClickHouse endast stöder Hash JOIN. Om det inte finns tillrÀckligt med RAM för de mÄnga data som ska kopplas ihop, kan JOIN inte genomföras.
Om data har hög cardinalitet, slösa inte tid pÄ det, lagra dem i denormaliserad form, URL:er direkt inplace i huvudtabellen.
* Men nu finns det merge join i ClickHouse ocksÄ, och det fungerar under omstÀndigheter dÀr mellanliggande data inte fÄr plats i RAM. Men det Àr ineffektivt och rekommendationen kvarstÄr.

Ytterligare nÄgra exempel, men jag börjar tvivla pÄ om de verkligen Àr antipatroner eller inte.
ClickHouse har en kÀnd nackdel. Den kan inte hantera uppdateringar. PÄ ett sÀtt Àr det faktiskt bra. Om du har viktiga data, till exempel bokföring, kommer ingen att kunna skicka dem eftersom det inte finns nÄgra uppdateringar.
* Stöd för uppdateringar och borttagningar i batchlÀge har lÀnge lagts till.
Men det finns vissa speciella metoder som gör att uppdateringar kan ske i bakgrunden. Till exempel tabeller av typen ReplaceMergeTree. De utför uppdateringar under bakgrundsmeldningar. Du kan tvinga detta med hjÀlp av optimize table. Men gör inte detta för ofta, eftersom det medför en fullstÀndig omskrivning av partitionen.
Distribuerade JOINs i ClickHouse â det hanteras inte bra av frĂ„geplaneraren.
DÄligt, men ibland Àr det okej.
Att anvÀnda ClickHouse endast för att lÀsa tillbaka data med hjÀlp av select.
Jag skulle inte rekommendera att anvĂ€nda ClickHouse för tunga berĂ€kningar. Men det Ă€r inte helt sant, eftersom vi redan avviker frĂ„n den rekommendationen. Och vi har nyligen lagt till möjligheten att tillĂ€mpa maskininlĂ€rningsmodeller i ClickHouse â Catboost. Och det oroar mig, för jag tĂ€nker: "Herregud. Hur mĂ„nga cykler per byte blir det hĂ€r!". Jag hatar verkligen att slösa cykler pĂ„ bytes.

Men var inte rÀdd, installera ClickHouse, allt kommer att gÄ bra. Om det Àr nÄgot, sÄ har vi en gemenskap. Förresten, gemenskapen Àr ni. Och om ni har nÄgra problem kan ni Ätminstone gÄ in i vÄr chatt, och jag hoppas att ni fÄr hjÀlp.
FrÄgor
Tack för presentationen! Vart ska jag klaga pÄ ClickHouse-nedgÄngar?
Du kan klaga till mig personligen just nu.
Jag började anvÀnda ClickHouse nyligen. Föll direkt ner kommandoradsgrÀnssnittet.
Du har tur.
Lite senare kraschade jag servern med en liten select.
Du har talang.
Jag öppnade en bugg pÄ GitHub, men den ignorerades.
LÄt oss se.
Alexey lurade mig att delta i presentationen, han lovade att berÀtta hur ni komprimerar data.
VĂ€ldigt enkelt.
Det förstod jag redan igÄr. Mer konkreta exempel.
Det finns inga hemska knep. Det handlar helt enkelt om blockkomprimering. Som standard anvÀnds LZ4, men man kan aktivera ZSTD*. Blocken Àr mellan 64 kilobyte och 1 megabyte.
* det finns ocksÄ stöd för specialiserade komprimeringskodar som kan anvÀndas i kedjor med andra algoritmer.
Ăr blocken bara rĂ„data?
Inte helt rÄa. DÀr finns arrayer. Om du har en numerisk kolumn, sÄ Àr siffrorna placerade sekventiellt i en array.
FörstÄtt.
Alexey, exemplet med uniqExact över IP-adresser, dvs. att uniqExact tar lÀngre tid att berÀkna över strÀngar Àn över siffror och sÄ vidare. Och om vi tillÀmpar en trick och kastar vid lÀsning? Dvs. ni nÀmnde att det inte skiljer sig mycket pÄ disken. Om vi lÀser strÀngar frÄn disken och kastar, kommer vÄra aggregat att vara snabbare eller inte? Eller fÄr vi fortfarande en obetydlig vinst hÀr? Jag tycker att ni testade detta, men av nÄgon anledning angav ni inte det i benchmarken.
Jag tror att det kommer att vara lÄngsammare Àn utan casting. I sÄ fall mÄste IP-adressen parseras frÄn strÀngen. Vi har givetvis ocksÄ optimerad parsing av IP-adresser i ClickHouse. Vi har gjort vÄrt bÀsta, men dÀr Àr ju siffrorna skrivna i tiotusentalsformat. Mycket besvÀrligt. à andra sidan kommer uniqExact-funktionen att fungera lÄngsammare pÄ strÀngar, inte bara för att det Àr strÀngar, utan ocksÄ för att en annan algoritmspecialisering vÀljs. StrÀngar bearbetas helt enkelt pÄ ett annat sÀtt.
Men vad om vi tar en mer primitiv datatyp? Till exempel, vi har skrivit user id, som vi har in, skrivit det som en strÀng, och sedan castat, blir det roligare eller inte?
Jag tvivlar. Jag tror att det kommer att bli Ànnu tristare, eftersom parsing av siffror ÀndÄ Àr ett allvarligt problem. Jag tror att den hÀr kollegan till och med hade en presentation om hur svÄrt det Àr att parse siffror i tiotusentalsformat, eller kanske inte.
Alexey, stort tack för presentationen! Och stort tack för ClickHouse! Jag har en frÄga om funktionerna. Finns det planer pÄ en funktion för att uppdatera lexikonet delvis?
Det vill sÀga, partiell omladdning?
Ja, ja. Typ möjligheten att ange ett MySQL-fÀlt dÀr man kan uppdatera efter, sÄ att endast dessa data laddas om lexikonet Àr vÀldigt stort.
Mycket intressant funktion. Och jag tycker att nÄgon kille föreslog den i vÄr chatt. Kanske var det till och med du.
Jag tror inte det.
UtmĂ€rkt, nu visar det sig att det Ă€r tvĂ„ förfrĂ„gningar. Och man kan lugnt börja göra. Men jag vill genast varna er för att den hĂ€r funktionen Ă€r ganska enkel att implementera. Det vill sĂ€ga, i teorin behöver man bara skriva versionsnumret i tabellen och sedan skriva: version mindre Ă€n sĂ„ hĂ€r. Och det betyder att vi troligen kommer att föreslĂ„ att entusiasterna gör det. Ăr du en entusiast?
Ja, men tyvÀrr inte i C++.
Kan dina kollegor skriva i C++?
Jag ska hitta nÄgon.
UtmÀrkt*.
* möjligheten lades till tvĂ„ mĂ„nader efter presentationen â den utvecklades av frĂ„gestĂ€llaren och skickades in. .
Tack!
Hej! Tack för föredraget! Du nÀmnde att ClickHouse mycket effektivt anvÀnder alla tillgÀngliga resurser. Och talaren intill frÄn Luxoft berÀttade om sin lösning för PostNord. Han sa att de verkligen gillade ClickHouse, men de anvÀnde det inte istÀllet för sin huvudsakliga konkurrent eftersom det tog upp hela processorn. Och de kunde inte fÄ in det i sin arkitektur, i sin ZooKeeper med Docker. Finns det nÄgot sÀtt att begrÀnsa ClickHouse sÄ att det inte utnyttjar allt som blir tillgÀngligt för det?
Ja, det kan man och det Àr vÀldigt enkelt. Om du vill att det ska anvÀnda fÀrre kÀrnor, skriv bara set max_threads = 1. Och allt, det kommer att utföra förfrÄgan pÄ en kÀrna. Dessutom kan olika anvÀndare ges olika den hÀr instÀllningen. SÄ inga problem alls. Och sÀg till kollegorna frÄn Luxoft att det inte Àr bra att de inte hittade den hÀr instÀllningen i dokumentationen.
Alexey, hej! Jag skulle vilja stÀlla en frÄga. Jag har hört flera gÄnger nu att mÄnga börjar anvÀnda ClickHouse som lagring för loggar. I föredraget sa du att man inte bör göra sÄ, d.v.s. att man inte behöver lagra lÄnga rader. Vad tycker du om det?
För det första, loggar Ă€r oftast inte lĂ„nga rader. Det finns dock undantag. Till exempel, en tjĂ€nst skriven i java kastar ett undantag, det loggas. Och sĂ„ i en oĂ€ndlig loop, och det tar slut pĂ„ utrymme pĂ„ hĂ„rddisken. Lösningen Ă€r mycket enkel. Om raderna Ă€r vĂ€ldigt lĂ„nga, sĂ„ klipp dem. Men vad betyder lĂ„nga? Tiotals kilobyte â det Ă€r dĂ„ligt*.
* i de senaste versionerna av ClickHouse Àr "adaptiv granuleringsindexering" aktiverat, vilket löser problemet med att lagra lÄnga rader till stor del.
Ăr en kilobyte okej?
Okej.
Hej! Tack för föredraget! Jag har redan frÄgat om detta i chatten, men jag kommer inte ihÄg om jag fÄtt svar. Planerar ni att pÄ nÄgot sÀtt utöka sektionen WITH i stil med CTE?
Inte för tillfÀllet. Sektionen WITH Àr lite ofullstÀndig. Den Àr mer som en liten funktion.
Jag förstÄr. Tack!
Tack för föredraget! Mycket intressant! En övergripande frÄga. Planerar ni att göra, kanske i form av nÄgra dummys, en modifiering för att ta bort data?
Absolut. Detta Àr vÄr första uppgift i vÄr kö. Vi har nu aktivt tÀnkt igenom hur man gör allt rÀtt. Och det Àr dags att börja trycka pÄ tangentbordet*.
* tryckte pÄ knapparna pÄ tangentbordet och gjorde allt.
Kommer detta att pÄverka systemets prestanda pÄ nÄgot sÀtt? Kommer inmatningen att vara lika snabb som den Àr nu?
Kanske sjÀlva deletes och updates blir mycket tunga, men det pÄverkar inte prestandan för selects och inserts.
Och en liten frÄga till. PÄ presentationen talade ni om primary key. SÄledes har vi partitionering som som standard Àr mÄnadsvis, eller hur? Och nÀr vi stÀller in ett dataintervall som faller inom en mÄnad, sÄ lÀser vi endast den partitionen, eller hur?
Ja.
SÄ hÀr Àr en frÄga. Om vi inte kan sÀrskilja nÄgon primary key, Àr det korrekt att göra det baserat pÄ fÀltet "Datum" för att minimera omstruktureringen av dessa data sÄ att de hÄlls mer ordnat? Om ni inte har intervallsökningar och inte ens kan vÀlja nÄgon primÀrnyckel, bör man dÄ sÀtta datumet i primÀrnyckeln?
Ja.
Kanske Àr det meningsfullt att inkludera ett fÀlt i primÀrnyckeln dÀr data komprimeras bÀttre om de sorteras pÄ det fÀltet. Till exempel, anvÀndarens identifierare. AnvÀndaren besöker kanske samma webbplats. I det hÀr fallet inkluderar ni anvÀndarens id och tiden. DÄ kommer era data att komprimeras bÀttre. NÀr det gÀller datum, om ni verkligen inte har och aldrig har nÄgra intervallsökningar baserad pÄ datum, sÄ kan ni kanske lÄta bli att sÀtta datumet i primÀrnyckeln.
Tack sÄ mycket!
KĂ€lla: habr.com
