Талдау қоймаларын индекстеу
1) Неге индекстеу iGaming-платформасы
Талдау жылдамдығы: GGR/NET, конверсиялар, RG/AML және A/B-эксперименттер бойынша есептер SLA-ға жинақталады.
Құны: сканерленетін байттан аз → есептеу есебінен төмен/қойма.
Сенімділік: дашбордтар мен API метриктерінің тұрақты p95/p99 жасырындылығы.
Масштабы: «full scan» тозақ құнсыз ондаған брендтер/нарықтар/PSP/провайдерлер.
2) Жүктеме моделі (индекстеуден бұрын)
Факты: `payments`, `game_rounds`, `sessions`, `bonus_events`.
Өлшемдері: 'dim _ user' (PII жоқ), 'dim _ provider', 'dim _ psp', 'dim _ country'.
Сұраулар: «Соңғы N күндер», 'brand/country/provider/psp' бойынша агрегациялар, мәртебе өрісі бойынша сүзгілер, surrogate-keys бойынша join's, JSON-атрибуттары бойынша іздеу (төлем әдісі, құрылғы), top-K/percentile.
Индекстерді селективтілікке, түбегейлілікке және пайдалану жиілігіне қарай таңдаймыз.
3) Индекстердің түрлері және оларды қашан алу керек
3. 1 Классика
B-tree: жоғары селективті бағандар бойынша теңдік/ауқымдар ('user _ surrogate _ id', 'occurred _ at', 'amount').
Hash: таза теңдік; талдамада сирек (әлсіз диапазондарға қарсы).
Bitmap: төмен түбірлік және жиі қосылған сүзгілер ('country', 'kyc _ level', 'rg _ state', 'brand'). Маскаларды қосу үшін өте жақсы.
3. 2 Columnar-ерекшелігі
Min-max (data skipping): паркет-страйптарда/бөліктерде «минимум/максимум» автоматты статистикасы → қозғалтқыш блоктарды өткізеді. Сүзілетін өрістер бойынша сұрыптау кезінде жақсы жұмыс істейді.
Bloom-индекстер: блоктағы мәндер тиістілігінің жылдам ықтималдық тестілері ('user _ id', 'transaction _ id', 'psp' үшін пайдалы).
BRIN (Block Range Index): егер деректер табиғи түрде реттелген болса, блоктар ауқымына арзан «көрсеткіштер». Арзан, бірақ time-series үшін тиімді.
3. 3 Ілгерілетілген/мамандандырылған
GiST/GIN (инвертирленген): JSON/arrays/мәтін, ішкі төлсипаттар бойынша сүзгілер ('metadata. method = 'Papara'`, `device. os in [...]`).
Join/Projection (ClickHouse/MPP): join/agg жылдамдатуға арналған материалдар (pre-join key фактімен қатар сақталады, алдын ала агрегациялар).
Векторлық (ANN): ұқсас эмбеддингтерді іздеу (ұсынымдар/антифрод-мінез-құлық) - IVF/HNSW/Flat «жақын көршілердің индексі» ретінде.
Z-реттеу/Z-order (lakehouse/Databricks )/Cluster keys (Snowflake )/ORDER BY (ClickHouse): үздік data skipping үшін дискідегі деректерді көп өлшемді кластерлеу.
4) Партияландыру, сұрыптау, кластерлеу
Партиялар (date/country/brand): «шағын файлдардың қарғысын» болдырмау үшін үлкен (күн/апта). WHERE/қатынау құқығындағы жоғары селективті өрістерді таңдаймыз.
Партия ішіндегі сұрыптау: 'ORDER BY (occurred_at, brand, psp)' немесе '(brand, country, provider)' бойынша Z-order - осылайша min-max және bloom жақсы пысықтайды.
Cluster/Recluster: локальді сақтау үшін мерзімді қайта кластерлеу.
TTL және ретеншн: ескі партияларды/сегменттерді автоматты түрде жою.
5) Материалдандырылған көріністер мен проекциялар
Ыстық тіліктер үшін MV: 'payments _ 7d _ by _ brand _ psp', 'rounds _ 1d _ by _ provider'. Біз инкременталды қолдаймыз (streaming upserts).
Проекциялар (ClickHouse )/Aggregate tables: алдын ала топтамалар, roll-up деңгейлері (сағат → күн → апта).
Нәтиже кэші: қайталанатын дашбордтар үшін query result cache/warehouse result cache (сұрау белгісі және деректердің жаңаруы бойынша валидацияланады).
6) Жартылай құрылымдалған деректер (JSON/VARIANT)
Жолдар бойынша индекстер: json-жолдардағы инвертирленген/GIN-индекс ('$ .device. os`, `$.psp. details. method`).
Бағандарға маңызды атрибуттарды материалдандыру: тұрақты сүзгілер үшін (төлем әдісі, құрылғы, қосымшаның нұсқасы).
Кілттер бойынша статистика: селективті жоспар үшін дистрибуциялар жинау.
7) Деректер көлдері: Iceberg/Delta/Hudi
Манифест-индекстер: паркет-файлдар туралы метадеректер (min-max, null-count, bloom) → partition pruning + file skipping.
Компакция/файлдарды біріктіру: тұрақты merge шағын файлдарды «оңтайлы» өлшемге (128-1024 МБ).
Clustering/Z-order: корреляциялық өрістер үшін файлдарды қайта қаптау (мысалы, 'brand, country, occurred _ at').
Delete/Update индекстері: merge-on-read жылдамдатуға арналған позициялық делттер мен bloom.
8) Индекстерді қалай таңдау керек: практикалық чек-парақ
1. Top-N сұрауларын жинаңыз (жүктеменің 90%) → сүзгі өрістері/join/group.
2. Әрбір өріс үшін 'sel = 1 - distinct (value )/rows' селективтілігін және кардиналдығын бағалаңыз.
3. Уақыт бойынша партия + 1-2 тұрақты сүзгілермен/қолжетімділікпен өлшеу.
4. Сұрыптау/keys кластерін сүзгілермен және join-кілттермен келісу.
5. Төмен түбірлік үшін нүктелік id, bitmap үшін bloom қосыңыз.
6. Ыстық агрегациялар → MV/проекциялар.
7. JSON жолдары → инвертирленген индекстер + материализация.
8. Көлдерде - кесте бойынша компакция және clustering.
9. SLO енгізіңіз: p95-жасырындылық, сканерленетін байттар/сұрау, skipped data үлесі.
9) Қолдау және қызмет көрсету
ANALYZE/статистика: түбегейліктер мен гистограммаларды жаңартыңыз; әйтпесе «соқыр» оңтайландырушы.
VACUUM/OPTIMIZE/RECLUSTER: дефрагментация және қайта кластерлеу.
«covering rate», «unused index list», «bytes scanned/bytes skipped» индекстерін пайдалану мониторингі.
Авто-кеңесшілер: query log негізінде кластер-кілттер және сұрыптау бойынша мерзімді ұсынымдар.
Регрессия тестілері: жаңа кілттерді сақтау алдында - сұрау салулар профилі мен құнын салыстыру.
10) Метрика және SLO индекстеу
Техникалық: p95/p99 latency, scanned bytes/query, skipped bytes%, files touched, cache hit-rate.
Экономика: $/сұраныс, $/дашборд, $/TB сканер.
Операциялар: компакция уақыты, қайта кластерлеу кезегі, «шағын файлдар» үлесі.
Жоспарлардың сапасы: индекстерді/проекцияларды пайдаланатын сұрау салулардың үлесі, түбегейлілік дәлдігі.
11) iGaming кейстері (дайын рецептер)
11. 1 Төлемдер/PSP: құлдырау/істен шығу
'by day' партиясы. Сұрыптау: '(brand, country, occurred_at)'.
Bloom: `transaction_id`, `user_id`. Bitmap: `psp`, `status`.
MV: `payments_7d_by_brand_psp(status, declines)`.
Нәтиже: p95 ↓ с 8. 2s дейін 1. 1s, scanned bytes ↓ на 87%.
11. 2 Ойын раундтары: провайдер/ойын
Z-order / ORDER BY: `(provider, game_id, occurred_at)`.
Projection/agg: `rounds_1d_by_provider_game`.
BRIN (егер Postgres сияқты сақтау орны болса): 'occurred _ at' бойынша.
Нәтижесі: Top-K ойындары/сағ - ыстық кэште sub-second.
11. 3 RG/AML: шектеу/өздігінен алып тастау оқиғалары
Bitmap: `rg_state`, `kyc_level`. JSON-path GIN: `$.reason`.
MV: «30 күн ішіндегі белсенді шектеулер» + PII-сіз user-деңгейді материалдандыру.
Нәтижесі: full scan миллиард оқиғасыз комплаенс үшін жылдам іріктемелер.
11. 4 Антифрод: бағыттар мен құрылғылар
JSON материализациясы → бағандар: 'device. os`, `device. model`, `payment. method`.
Bloom: `graph_device_id`. Cluster: `(brand, country, device. os)`.
Векторлық индекс: эмбеддингтер «7д үшін депозиттердің тәртібі» → ұқсас аномалиялар үшін жылдам k-NN.
12) Қауіпсіздік және құпиялылық
Zero-PII индекстелетін өрістерде және жоспар логдарында.
Дискідегі шифрлау: индекстер/статистика деректер сияқты шифрланады.
Агрегаттардың K-анонимділігі: MV/проекцияларды тек ≥ N топтары ғана жариялайды.
Geo/tenant-оқшаулау: партия/кілттер 'brand/country/license' қамтиды.
Legal Hold: индекстер/манивесттер де «мұздатуға» түседі.
13) Қарсы үлгілер
Индекстеу «барлығы қатарынан» → жарылыс көлемі және write-amplification.
Ұсақ партиялар (сағат/минут) → планкалар дауылы және «шағын файлдар».
→ нөлдік data skipping сүзгілерімен сәйкес келмейтін сұрыптау кілттері.
Статистиканың жоқтығы → жаман жоспарлар, full scan.
JSON жол индекстерінсіз және «ыстық» атрибуттарды материалдандырусыз.
Компакция игноры және recluster → 2-4 аптадан кейін деградация.
14) Үлгілер (пайдалануға дайын)
14. 1 Кластерлеу/индекстеу саясаты (YAML)
yaml dataset: gold. payments partition_by: ["date"]
order_by: ["brand","country","occurred_at"]
indexes:
bloom: ["transaction_id","user_surrogate_id"]
bitmap: ["psp","status","rg_state"]
materialized_views:
- name: mv_payments_7d_brand_psp group_by: ["brand","psp","status"]
window: "7d"
slo:
p95_latency_ms: 1200 scanned_bytes_per_query_max_mb: 256 maintenance:
compact_small_files: true recluster_cron: "0 /6 "
privacy:
pii_in_index: false
14. 2 Көлдің компакция жоспары (Iceberg/Delta)
yaml compaction:
target_file_size_mb: 512 small_file_threshold_mb: 64 zorder_by: ["brand","country","occurred_at"]
run_every: "PT6H"
max_concurrency: 4
14. 3 JSON өрістеріне арналған индекстер
sql
-- GIN/inverted index on device attributes
CREATE INDEX idx_device_json ON gold. sessions
USING GIN ((device_json));
-- Materialization of critical pathways
ALTER TABLE gold. sessions ADD COLUMN device_os TEXT;
UPDATE gold. sessions SET device_os = device_json->>'os';
CREATE BITMAP INDEX idx_device_os ON gold. sessions(device_os);
14. 4 SLO индекстер мониторингі
yaml monitoring:
skipped_bytes_share_min: 0. 70 index_usage_rate_min: 0. 85 stats_freshness_max_hours: 24 small_files_share_max: 0. 10
15) Енгізу жол картасы
0-30 күн (MVP)
1. Топ-N сұрауларын және сканерлеу профильдерін жинау.
2. Сүзгілермен келісілген + сұрыптау күні бойынша партияландыру.
3. Id өрістері үшін data skipping (min-max) және bloom қосылсын.
4. «Ыстық» метрика үшін бір MV (payments 7d).
5. SLI дашборды: p95, scanned bytes, skipped share, small files.
30-90 күн
1. JSON-жолдары: инвертирленген индекстер + материалдану.
2. Көл: 2-3 кілт бойынша компакция және Z-order/clustering.
3. Кілттердің/проекциялардың авто кеңесшісі; Тұрақты ANALYZE.
4. «Шағын файлдар» бар жерде (day → week) партияларды қайта қарау.
3-6 ай
1. Нұсқасы мен SLA бар MV/проекциялар каталогы.
2. Ұсынымдар/антифрод үшін векторлық индекстер.
3. SLO мен бюджеттердің бірыңғай саясаты $/сұрау; деградация аллергі.
4. Индекстер құпиялылығының аудиті, geo/tenant-оқшаулау.
16) RACI
Data Platform (R): партиялар/индекстер/компакциялар, авто-кеңесшілер, мониторинг.
Analytics/BI (R): Дашбордқа арналған MV/проекциялар, сұрауларды профильдеу.
Domain Owners (C): «ыстық» кесінділер мен сүзгілердің өлшемдері.
Security/DPO (A/R): құпиялылық, PII-саясат, geo/tenant-кілттер.
SRE/Observability (C): SLO/алертинг, компакцияға арналған капасити.
Finance (C): бюджеттер $/сұраныс және индекстерден үнемдеу.
17) Байланысты бөлімдер
Деректер схемалары және олардың эволюциясы, Деректерді валидациялау, DataOps-практикалары, Аномалиялар мен корреляцияларды талдау, API аналитикасы және метрикасы, Деректерді кластерлеу, Өлшемдерді төмендету, MLOps: модельдерді пайдалану.
Жиынтығы
Аналитикалық қойманы индекстеу - «барлығына индекс жасау» емес, стратегия. Дұрыс партиялар мен сұрыптаулар, data skipping және bloom, ойластырылған MV/проекциялар және тұрақты компакция бақыланатын құн кезінде және құпиялылық үшін тәуекелсіз жылдам және болжамды сұрау береді. iGaming үшін бұл SLA және бюджет шегінде төлемдер, провайдерлер және RG/AML бойынша жедел шешімдерді білдіреді.