Bosh sahifa Wiki ClickHouse

ClickHouse

ClickHouse — katta hajmdagi ma’lumotlar ustida tez analitik SQL querylar bajarishga mo‘ljallangan columnar database management system. U log analytics, clickstream, monitoring, business intelligence va event tahlilida ishlatiladi.

ClickHouse yuqori ingest throughput, column pruning, vectorized execution va compressed storage orqali katta scan hamda aggregationlarni tez bajarishga intiladi.

Columnar storage

Har column alohida saqlanadi.

Query:

SELECT region, SUM(amount)
FROM sales
GROUP BY region;

faqat region va amount columnlarini o‘qishi mumkin.

Keraksiz katta text yoki JSON columnlar scan qilinmaydi.

Part

Insert qilingan data immutablega yaqin partlarga yoziladi.

Har part:

saqlaydi.

Background merge kichik partlarni kattaroq partlarga birlashtiradi.

MergeTree oilasi

ClickHouse’dagi keng tarqalgan table engine’lar MergeTree oilasiga mansub.

Ular:

bilan ishlaydi.

Table engine data lifecycle va duplicate semantikasiga ta’sir qiladi.

ORDER BY

MergeTree table’dagi ORDER BY fizik sorting keyni belgilaydi.

Bu query resultining avtomatik tartibini emas, data diskda qanday joylashishini bildiradi.

Yaxshi sorting key:

  • asosiy filterlarga mos;
  • cardinality tartibini hisobga oladi;
  • range scanlarni qisqartiradi.

Keyni keyinchalik o‘zgartirish katta rewrite talab qilishi mumkin.

Primary index

ClickHouse primary index sparse bo‘lishi mumkin.

U har row uchun emas, granule yoki mark oralig‘i uchun key qiymatlarini saqlaydi.

Query sorting key bo‘yicha filter qilsa keraksiz granule’lar skip qilinadi.

Bu OLTP’dagi unique primary key index bilan bir xil emas.

Granule

Data ma’lum rowlar guruhiga bo‘linadi.

Har granule uchun mark va index metadata mavjud.

Kichik granule aniqroq skipping, lekin ko‘proq metadata beradi.

Katta granule kam metadata, ammo ortiqcha row o‘qishi mumkin.

Partition

Partition data lifecycle va maintenance uchun ishlatiladi.

Ko‘pincha oy yoki kun bo‘yicha.

Partition keyni juda mayda qilish ko‘p part va metadata yaratadi.

Query performance uchun asosiy vosita sorting key; partition faqat yirik pruning beradi.

Insert

ClickHouse batch insertni afzal ko‘radi.

Har kichik insert yangi part yaratishi mumkin.

Juda ko‘p mayda part:

yaratadi.

Application eventlarni batchlaydi yoki buffering qatlami ishlatadi.

Background merge

Bir partition ichidagi partlar background’da birlashtiriladi.

Merge:

  • sorted data’ni qo‘shadi;
  • engine semantikasini qo‘llaydi;
  • disk I/O;
  • CPU;
  • temporary space

ishlatadi.

Merge ortda qolsa partlar soni oshadi.

Mutation

Katta update va delete odatda yangi partlar yaratib, eski data’ni background rewrite qiladi.

Bu row-oriented OLTP update’dan qimmatroq.

Frequent individual update workload uchun ClickHouse asosiy database bo‘lmasligi mumkin.

Lightweight delete

Ayrim delete mexanizmlari rowlarni mask qilib, keyingi merge’da fizik olib tashlashi mumkin.

Query masklangan rowlarni filtrlashi kerak.

Disk joyi darhol qaytmasligi mumkin.

Compression

Column type va sorting takroriy qiymatlarni yaqin joylashtiradi.

Codec’lar:

  • delta;
  • double delta;
  • dictionaryga yaqin;
  • general compression

bilan ishlashi mumkin.

To‘g‘ri type va sorting compression ratio’ga katta ta’sir qiladi.

Vectorized execution

Operatorlar qiymatlar blocki ustida bajariladi.

CPU cache va SIMD imkoniyatlaridan foydalaniladi.

Expression va aggregate functionlar row-by-row virtual call o‘rniga batch usulida ishlaydi.

Distributed table

Distributed table query va insertlarni bir nechta shardga yo‘naltiradi.

Local tablelar har shardda data’ni saqlaydi.

Distributed query partial aggregationni shardlarda bajarib, final natijani coordinatorga yaqin node’da birlashtiradi.

Sharding key

Insert qaysi shardga tushishini belgilaydi.

Yaxshi key loadni teng taqsimlaydi.

Tenant yoki vaqt qiymati skewed bo‘lsa hot shard paydo bo‘ladi.

Random sharding entity bo‘yicha local queryni qiyinlashtirishi mumkin.

Replication

Replicated table engine replica’lar orasida part metadata va data nusxalarini boshqaradi.

Replication asynchronous bo‘lishi mumkin.

Insert quorum va read consistency sozlamalari talabga qarab ishlatiladi.

Replica backupning o‘rnini bosmaydi.

Materialized view

Insert oqimini boshqa target table’ga transform va aggregate qilib yozishi mumkin.

Masalan, raw eventdan kunlik summary.

Materialized view odatda yangi insertlarga ishlaydi.

Oldingi data uchun alohida backfill talab qilinadi.

TTL

Table yoki column data’si uchun vaqtga asoslangan lifecycle belgilanadi.

TTL:

  • delete;
  • boshqa diskga ko‘chirish;
  • aggregation;
  • recompression

amalini ishga tushirishi mumkin.

Background merge TTL qoidalarini fizik qo‘llaydi.

Approximate function

Katta unique count, quantile va top keylar uchun approximate aggregate functionlar mavjud bo‘lishi mumkin.

Ular memory va tezlikni yaxshilaydi.

Aniq audit hisobi uchun exact variant talab qilinadi.

Data skipping index

Sorting keydan tashqari ayrim column bloklari uchun min-max, set yoki Bloom filterga o‘xshash skipping index yaratilishi mumkin.

U blockda kerakli qiymat yo‘qligini aniqlab scan’ni kamaytiradi.

Noto‘g‘ri granularity va yuqori false positive foydani kamaytiradi.

FINAL

Ayrim MergeTree variantlarida background merge hali duplicate yoki replacement rowlarni yakuniy birlashtirmagan bo‘lishi mumkin.

FINAL query vaqtida merge semantikasini majburan qo‘llaydi.

Bu correctnessni oshirishi, ammo katta table’da qimmat bo‘lishi mumkin.

Bog‘liq tushunchalar

Columnar database, MergeTree, Part, Sorting key, Sparse index, Partition, Vectorized execution, Distributed table, Materialized view, OLAP