GH GambleHub

Soraglary indekslemek we optimizirlemek

1) Indeksirlemegiň we optimizirlemegiň maksatlary

Gizlinlik: P50/P95/P99 gysgaldylmagy.
Geçirijilik ukyby: gorizontal masştaby bolmazdan QPS ösüşi.
Öňünden aýdylýanlygy: durnukly meýilnamalar we jogap wagtynyň "böküşleriniň" ýoklugy.
Tygşytlamak: IO/CPU az, bulut üçin az hasap.
Ygtybarlylyk: dogry elýeterliligiň hasabyna blokirlemeleriň we möhletleriň azalmagy.

Üýtgeşik:
  • Islendik optimizasiýa dogrylygy we sazlaşygy saklamaly.
  • Metriklerde we meýilnama ýazgylarynda täsirini yzarlamak.

2) Indeksleriň esasy gurluşlary we olary haçan ulanmak

2. 1 B-Tree (defolt)

Deň/diapazonlar, sortlar, 'ORDER BY'.
Wagt/ID/status boýunça süzgüçleriň köpüsi üçin amatly.

2. 2 Hash

Arassa deňlikler ('='), ýat taýdan arzan, ýöne tertipsiz (PG: çäklendirmeler aýryldy, ýöne henizem niş saýlama).

2. 3 GIN / GiST (PostgreSQL)

GIN: massivler/JSONB açarlary, doly tekst (tsvector), containment ('@>').
GiST: geo, diapazonlar, kNN.

2. 4 BRIN (PostgreSQL)

"Tebigy sortlanan" stollar boýunça super arzan indeks (append-only). Uly tablisalar bilen wagt seriýasy üçin gowy.

2. 5 Bitmap (MySQL/InnoDB: native; DW-SUBD/OLAP)

Pes kardinallyk we fasetler üçin, köplenç sütün ammarlarynda täsirli.

2. 6 Sütün görkezijileri (ClickHouse)

Primary key + data skipping (minmax), secondary через `skip indexes` (bloom, set).
OLAP soraglary agregasiýalar we diapazonlar bilen.

2. 7 Ters indeksler (Elasticsearch/OpenSearch)

Doly tekst, faset, gibrid gözleg. Takyk süzgüçler üçin keyword we doc values ulanyň.

2. 8 MongoDB

Single, compound, multikey (massiwler), partial, TTL, text, hashed (birmeňzeş açar şarding üçin).

3) Açarlary we kompozit indeksleri dizaýn etmek

3. 1 "Çep prefiks" düzgüni

Indeksdäki meýdanlaryň tertibi ulanylyşyny kesgitleýär.
'WHERE tenant_id =? AND created_at >=? ORDER BY created_at DESC` → индекс `(tenant_id, created_at DESC, id DESC)`.

3. 2 Tie-breaker

Durnukly sortlamak we seek-paginasiýa üçin özboluşly guýruk (adatça 'id') goşuň.

3. 3 Bölekleýin/süzülen indeksler

Diňe "gyzgyn" bölekleri indeksläň:
sql
CREATE INDEX idx_orders_paid_recent
ON orders (created_at DESC, id DESC)
WHERE status = 'paid' AND created_at > now() - interval '90 days';

3. 4 Örtýän indeksler

"Okalýan" (MySQL: 'INCLUDE'; PG 11+: `INCLUDE`):
sql
CREATE INDEX idx_user_lastseen_inc ON users (tenant_id, last_seen DESC) INCLUDE (email, plan);

3. 5 Funksional/hasaplanyp bilinýän

Indeksde açarlary kadalaşdyryň:
sql
CREATE INDEX idx_norm_email ON users (lower(email));

4) Partiýa ýerleşdirmek we şardlamak

4. 1 Partiýa ýerleşdirmek (PG native/tablisa miras; MySQL RANGE/LIST)

Partiýalaryň wagt boýunça aýlanmagy ('daily/weekly') 'VACUUM/DELETE' -ni ýönekeýleşdirýär.
Indeksler ýerli partiýa → B-Tree-den kiçi, has çalt meýilnama.

sql
CREATE TABLE events (
tenant_id bigint,
ts timestamptz,
...
) PARTITION BY RANGE (ts);

4. 2 Partiýa açary

OLTP-da - 'tenant _ id' (ýüküň lokalizasiýasy).
Time-series/OLAP-da - 'ts' (aralyk soraglary).
Gibrid: '(tenant_id, ts)' + subpartiýalar.

4. 3 Şardlamak

Consistent hashing/range-shard 'tenant _ id' ýa-da wagt boýunça.
Çapraz-şard soragy → skatter-gather we k-way merge; saklaň per-shard cursor.

5) Statistika, kardinallyk we meýilnamalar

5. 1 Häzirki statistika

Awto-derňewi açyň ('autovacuum/autoanalyze'), "hapa" paýlamalar üçin 'default _ statistics _ target' -ni köpeldiň.

5. 2 Ösen statistika (PG)

Baglanyşdyrylan sütünler:
sql
CREATE STATISTICS stat_user_country_city (dependencies) ON country, city FROM users;
ANALYZE users;

5. 3 Ýerine ýetiriş meýilnamasy

'EXPLAIN (ANALYZE, BUFFERS, VERBOSE)' seret; Esasy meýdanlar:
  • `Rows`, `Loops`, `Actual time`, `Shared Read/Hit`, `Recheck Cond`.
  • Типы join: Nested Loop, Hash Join, Merge Join.
  • Seq Scan vs Index Scan/Only Scan/Bitmap Heap Scan.

5. 4 Meýilnamalaryň durnuklylygy

Parametrlemek (prepared statements) erbet meýilnamada "ýapyşyp" biler. Plan cache guardrails (PG: 'plan _ cache _ mode = force_custom_plan' problema soraglary üçin) ýa-da "pass" sabitleri ulanyň.

6) Join-olary we sortlary optimizirlemek

6. 1 Strategiýalar

Nested Loop: kiçi daşarky, içerki çalt indeks.
Hash Join: uly toplumlar, hash stolunyň aşagynda ýat ýeterlik.
Merge Join: sortlanan girelgeler, eýýäm bar bolan tertipde peýdaly.

6. 2 Join aşagyndaky indeksler

Üçin 'A JOIN B ON B.a_id = A.id' → indeks üçin 'B (a_id)'.
Join-den soň süzgüç üçin - içerki tablisanyň süzgüç sütünlerindäki indeks.

6. 3 Sortlamak

Degişli indekssiz 'ORDER BY' -den gaça duruň; uly toplumlarda sortlamak ýat/disk arkaly ýol.

7) Soraglary täzeden ýazmak (query rewrite)

"Gar" soraglaryndan dynyň; JOIN-de açyň.
CTE-inline (PG ≥ 12 inlines CTE-ni ulanyň, ýöne 'MATERIALIZED' zerur bolsa aralyk netijäni düzedip biler).
'SELECT' -i aýyryň → meýdanlary sanaň (IO/tor tygşytlamak).
Hasaplamalary "WHERE" -den indekslenýän görnüşe geçiriň.
Agregasiýalar: inkremental täzelenme bilen deslapky jemleýji tablisalar/materiallaşdyrylan çykyşlar.

8) Batçing, çäklendirme we paginasiýa

Batch-insert/update: paketler 500-5000 bölek ýerine.
Seek-paginasiýa '(sort_key, id)' derin 'OFFSET' ýerine.
Sortdan/joýndan öň toplumyň çäkleri (push-down 'LIMIT').

9) Kesmek we denormallaşdyrmak

Programma derejesiniň kwery-cache (açar = SQL + bind-vars + hukuk görnüşi).
Materialized views agyr agregatlar üçin; aýlanyş/refres meýilnamasy.
Denormalizasiýa: ýygy-ýygydan okalýan hasaplanan meýdanlary saklaň (arzanladyş bilen), ýöne yzygiderlilik üçin trigger/fon meselesi bilen.
"Gyzgyn" açarlar üçin L2 hökmünde Redis (TTL we wakalar boýunça maýyplyk bilen).

10) Meşhur hereketlendirijileriň aýratynlyklary

10. 1 PostgreSQL

Индексы: B-Tree, Hash, GIN/GiST, BRIN, partial, functional, INCLUDE.

Mysal:
sql
CREATE INDEX idx_orders_tenant_created_desc
ON orders (tenant_id, created_at DESC, id DESC)
INCLUDE (amount, status);
Doly tekst:
sql
CREATE INDEX idx_docs_fts ON docs USING GIN (to_tsvector('russian', title          ' '          body));

10. 2 MySQL/InnoDB

Çylşyrymly, örtýän indeksler (meýdançalary açara goşmak bilen), synaglar üçin görünmeýän indeksler:
sql
ALTER TABLE orders ALTER INDEX idx_old INVISIBLE; -- check risk-free plans

Gistogrammalar boýunça statistika ('ANALYZE TABLE... UPDATE HISTOGRAM` в 8. 0).

10. 3 ClickHouse

Esasy açar = sortlamak; 'ORDER BY (tenant_id, ts, id)'.

Geçiş indeksleri:
sql
CREATE TABLE events (
tenant_id UInt64,
ts DateTime64,
id UInt64,
payload String,
INDEX idx_bloom_payload payload TYPE bloom_filter GRANULARITY 4
) ENGINE = MergeTree()
ORDER BY (tenant_id, ts, id);

10. 4 MongoDB

Kompozit/multfilmler: tertip möhümdir, süzgüç we sortlamak indeks bilen gabat gelmelidir:
js db. orders. createIndex({ tenant_id: 1, created_at: -1, _id: -1 });
db. orders. createIndex({ status: 1 }, { partialFilterExpression: { archived: { $ne: true } } });

Diagnostika üçin 'hint ()' ulanyň, 'covered query' -ni yzarlaň.

10. 5 Elasticsearch/OpenSearch

KeyWord vs text meýdanlar; Sortlamak/agregatlar üçin doc_values.
Heap segmentasiýasy: agregasiýalar - heavy; 'size' -ni çäklendiriň we 'composite' agregasiýasyny (sahypany saýlamak) ulanyň.
Analizatorlary takyk deňeşdirmek talap edilýän ýerlerde açmaň.

11) Bäsdeşlik, blokirleme we MVCC

Gysga amallar; "REPEATABLE READ" aşagyndaky "uzak" okamakdan gaça duruň.
Indeks amallary hem blokirlemäni alýar (write throughput azaldylýar).
Onlaýn indekslemegi meýilleşdiriň: 'CREATE INDEX CONCURRENTLY' (PG), 'ALGORITHM = INPLACE '/' ONLINE' (MySQL).
/ ID → Indeksiň "gyzgyn sahypalary"; açary paýlaň (UUIDv7/duz).

12) Synlamak we SLO

Metrikler:
  • Soragyň ady boýunça 'db _ query _ latency _ ms' (P50/P95/P99).
  • `rows_examined`, `rows_returned`, `buffer_hit_ratio`.
  • `deadlocks`, `lock_wait_ms`, `temp_sort_disk_usage`.
  • 'Index Scan' garaşylýan ýerinde 'Seq Scan' bilen meýilnamalaryň paýy.
  • DBB wersiýasyny/parametrlerini üýtgedeniňde regress-alertler.
Giriş/söwda:
  • Bosagasy bolan slow query log-ny açyň (mysal üçin 200 ms).
  • Soraglaryň spanlar bilen baglanyşygy (trace_id).
  • Problemaly soraglaryň meýilnamalaryny aýyryň we retrospektiv üçin obýektiň ammarynda saklaň.
SLO-mysal:
  • Okamak P95 '<= 150 ms' при 'LIMIT <= 50' we "gyzgyn" tenant.
  • 1000 setire çenli batçalarda '<= 200 ms' ýazgylaryň P95.

13) Howpsuzlyk we köp tenantlyk

Giriş gözegçiliginiň ugurlary boýunça indeksler ('tenant _ id', 'owner _ id') hökmanydyr.
Syýasatlar (RLS/ABAC) deslapky süzgüç bolmaly; ýogsam optimizator nädogry meýilleşdirýär.
Duýgur meýdanlary açyk görnüşde indekslemäň; heş/bellikleri ulanyň.

14) Anti-patternler

Seek-kursor alternatiwasy bolmazdan çuňňur 'OFFSET'.
"Hemme zat üçin bir indeks" - ýat ýüklemek we write-path.
'SELECT' kritiki ýollarda.
Işleýiş görkezijisi bolmadyk 'WHERE' sütüniniň üstündäki funksiýalar.
Köne statistika sebäpli durnuksyz meýilnamalar.
Durnukly tertibe garaşylanda 'ORDER BY' -iň ýoklugy.
Indeksler üçin indeksler: ROI <0 gymmat ýazgy/goldaw sebäpli.

15) Girizmegiň çek-sanawy

1. QPS we wagt boýunça Top-N soraglary → 3-5 kandidaty saýlaň.
2. "EXPLAIN ANALYZE" meýilnamalaryny aýyrmak, kardinallygy barlamak vs hakyky.
3. Indeksleri dizaýn et: meýdan tertibi, INCLUDE/partial/functional.
4. Uly tablisalar üçin partizasiýany girizmek (wagtlaýyn/tenant açarlary).
5. Soraglary täzeden ýazyň: 'SELECT' -i aýyryň, ýönekeý CTE-leri ýapyň, toplumy çäklendiriň.
6. Batching we seek-paginasiýany açyň.
7. Keş sazla: L1/L2, wakalar boýunça maýyplyk.
8. Meýilnamalara we slow-log, regress aladalaryna gözegçilik ediň.
9. Hakyky maglumatlary paýlamak bilen ýükleýji synaglary geçirmek.
10. Ösüş üçin gollanmalary täzelemek (ORM-hintler, indeksasiýa, çäkler).

16) "Öň/soň" mysallary

Çenli:
sql
SELECT FROM orders
WHERE status = 'paid'
ORDER BY created_at DESC
LIMIT 50 OFFSET 5000;
Soň:
sql
-- Индекс: (status, created_at DESC, id DESC) INCLUDE (amount, currency)
SELECT id, amount, currency, created_at
FROM orders
WHERE status = 'paid'
AND (created_at, id) < (:last_ts,:last_id)   -- seek
ORDER BY created_at DESC, id DESC
LIMIT 50;

17) ORM we API teswirnamalary

N + 1-den gaça duruň: açgöz nusgalar ('includes', 'JOIN FETCH', 'preload').
Meýdanlaryň aç-açan proýeksiýalary, paginate kursor.
gRPC/REST: 'page _ size' -ni çäklendiriň, 'sort' -y düzediň, aç-açan alamatlary ulanyň.
Keş meýilnamasy: parametrlemäni ulanyň; Her çagyryşda "üýtgeşik" SQL döretmäň.

18) Migrasiýa we ekspluatasiýa

Onlaýn indeksleri goşuň we INVISIBLE/CONCURRENTLY ýaly belläň, meýilnamalary synagdan geçiriň, soňra geçiň.
Indeksleriň barlaglary - yzygiderli sanitariýa arassalamak: köne zatlar üçin ulanylmaýan, "öli" dublikatlar.
Partiýanyň aýlanyş meýilnamasy (köne) we "VACUUM/OPTIMIZE" tertibi.

19) Gysgaça mazmuny

Soraglary optimizirlemek ulgamlaýyn in engineeringenerçilik: dogry açarlar we indeksler, takyk meýilnamalar, oýlanyşykly partiýa ýerleşdirmek we tertipleşdirmek, soraglardaky tertip-düzgün we ORM, keşlemek we gözegçilik etmek. Beýan edilen nusgalary berjaý etmek bilen, maglumatlaryň we ýüküň ösmegine çydamly çalt, öňünden aýdyp boljak we tygşytly ulgam alarsyňyz.

Contact

Biziň bilen habarlaşyň

Islendik sorag ýa-da goldaw boýunça bize ýazyp bilersiňiz.Biz hemişe kömek etmäge taýýar.

Integrasiýany başlamak

Email — hökmany. Telegram ýa-da WhatsApp — islege görä.

Adyňyz obýýektiw däl / islege görä
Email obýýektiw däl / islege görä
Tema obýýektiw däl / islege görä
Habar obýýektiw däl / islege görä
Telegram obýýektiw däl / islege görä
@
Eger Telegram görkezen bolsaňyz — Email-den daşary şol ýerden hem jogap bereris.
WhatsApp obýýektiw däl / islege görä
Format: ýurduň kody we belgi (meselem, +993XXXXXXXX).

Düwmäni basmak bilen siz maglumatlaryňyzyň işlenmegine razylyk berýärsiňiz.