SQL/NoSQL query optimization pattern, execution plan analysis, index strategy, N+1 resolution etc. database performance optimization guide. 'query optimization', 'execution plan', 'EXPLAIN', 'index ', 'N+1 ', 'slow query', 'slow query', 'DB performance' etc. database query performance improvement this for. bottleneck-analystand optimization-engineerof DB performance analysis -ize. , before system profilingthis benchmark execution this of scope .
Scanned 5/29/2026
Install via CLI
openskills install sideprojectmate/sideProjectMate---
name: query-optimization-patterns
description: "SQL/NoSQL query optimization pattern, execution plan analysis, index strategy, N+1 resolution etc. database performance optimization guide. 'query optimization', 'execution plan', 'EXPLAIN', 'index ', 'N+1 ', 'slow query', 'slow query', 'DB performance' etc. database query performance improvement this for. bottleneck-analystand optimization-engineerof DB performance analysis -ize. , before system profilingthis benchmark execution this of scope ."
---
# Query Optimization Patterns — query optimization pattern guide
database query performance systematicas analysisand optimizationlower methodology.
## execution plan analysis
### PostgreSQL EXPLAIN
```sql
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT o.*, c.name
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.created_at > '2024-01-01'
ORDER BY o.total_amount DESC
LIMIT 10;
```
### core metric
| metric | of | risk |
|------|------|----------|
| **Seq Scan** | before table | large tablefrom |
| **Nested Loop** | join | external tablethis |
| **Hash Join** | hash join | work_mem exceeding disk for |
| **Sort** | sort | memory exceeding external sort |
| **Bitmap Heap Scan** | index → table | lossy map performance lower |
| **actual time** | actual between | vs before this |
| **rows** | estimated vs actual this | 10 or more this → statistics renewal |
### risk pattern detection
```
❌ Seq Scan on large_table (rows=10000000)
→ index addition necessary
❌ Sort Method: external merge (Disk: 256MB)
→ work_mem or index sort
❌ Nested Loop (actual rows=1000000)
→ Hash Join or Merge Joinas transition
❌ estimated=100 actual=100000
→ ANALYZE executionto statistics renewal
```
## index strategy
### index typeper for
| index type | suitable | unsuitable |
|------------|-----------|-------------|
| B-Tree (default) | etc., scope, sort | , JSON, before search |
| Hash | etc. only | scope query |
| GIN | , JSONB, before search | simple etc./scope |
| GiST | between, scope type | simple |
| BRIN | -basedas sortthe data | distribution |
### index principle
```sql
-- rule (Leftmost Prefix)
CREATE INDEX idx_orders ON orders(status, created_at, customer_id);
-- this index lower query:
✅ WHERE status = 'PAID'
✅ WHERE status = 'PAID' AND created_at > '2024-01-01'
✅ WHERE status = 'PAID' AND created_at > '2024-01-01' AND customer_id = 123
❌ WHERE created_at > '2024-01-01' (status )
❌ WHERE customer_id = 123 (status, created_at )
-- column decision criteria:
-- 1. etc. cases column (optionalalso high )
-- 2. scope cases column
-- 3. ORDER BY column
```
### index
```sql
-- table this indexonlyas query completed
CREATE INDEX idx_covering ON orders(status, created_at) INCLUDE (total_amount);
SELECT total_amount FROM orders
WHERE status = 'PAID' AND created_at > '2024-01-01';
-- Index Only Scan → heap necessary
```
## N+1 resolution
###
```python
# N+1 pattern (!)
orders = Order.objects.filter(status="PAID") # query 1
for order in orders:
print(order.customer.name) # query N (order countonly)
# query: 1 + N
# Eager Loadingas resolution
orders = Order.objects.filter(status="PAID").select_related("customer") # query 1 (JOIN)
# or
orders = Order.objects.filter(status="PAID").prefetch_related("items") # query 2 (IN)
```
### ORMper resolution
| ORM | N+1 resolution | |
|-----|---------|------|
| Django | `select_related` / `prefetch_related` | FK JOIN / Reverse IN |
| SQLAlchemy | `joinedload` / `subqueryload` | JOIN / query |
| TypeORM | `relations` / `@JoinColumn` | eager/lazy configuration |
| Prisma | `include` | automatic |
| JPA | `@EntityGraph` / `JOIN FETCH` | JPQL/Criteria |
## thisthis optimization
| | SQL | performance | suitable |
|------|-----|------|------|
| OFFSET | `LIMIT 20 OFFSET 10000` | O(N) — | , seconds this |
| Keyset | `WHERE id > 1000 LIMIT 20` | O(1) — | , |
| Cursor | encryptionthe keyset | O(1) | API, clientfor |
```sql
-- OFFSET (10000from → 10000 after )
SELECT * FROM orders ORDER BY id LIMIT 20 OFFSET 10000;
-- Keyset (immediate corresponding locationas)
SELECT * FROM orders WHERE id > 10000 ORDER BY id LIMIT 20;
```
## query pattern
| pattern | | resolution |
|---------|------|------|
| `SELECT *` | necessary column before | necessary columnonly people |
| `WHERE func(column)` | index for impossible | transformation constant as this |
| `LIKE '%keyword%'` | | before search index(GIN) |
| query IN () | slow execution | JOINas transition |
| -based type transformation | index invalid-ize | type day |
## query optimization list
- [ ] EXPLAIN ANALYZE executionto execution plan confirmation
- [ ] Seq Scanthis ofalso-based confirmation ( data OK)
- [ ] estimated vs actual rows this confirmation
- [ ] necessary index
- [ ] N+1 query pattern without confirmation
- [ ] thisthisthis keyset confirmation
- [ ] necessary ORDER BY / DISTINCT removal
- [ ] transaction scope minimum confirmation
No comments yet. Be the first to comment!