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.
- 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.
- 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ň.
- 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.