123 lines
4.3 KiB
Markdown
123 lines
4.3 KiB
Markdown
---
|
||
phase: 07-pre-expansion-fixes
|
||
plan: 01
|
||
subsystem: database
|
||
tags: [performance, n+1, sql-optimization, indexes, static-cache]
|
||
|
||
requires:
|
||
- phase: 06-sonarqube-quality
|
||
provides: OrdersRepository refactored (god class split)
|
||
provides:
|
||
- Aggregating LEFT JOINs replacing N+1 correlated subqueries in orders list
|
||
- Static cache for information_schema check
|
||
- Performance indexes on orders table
|
||
affects: [07-02, 07-03, 07-04]
|
||
|
||
tech-stack:
|
||
added: []
|
||
patterns: [aggregating-left-join, static-property-cache]
|
||
|
||
key-files:
|
||
created:
|
||
- database/migrations/20260314_000048_add_orders_performance_indexes.sql
|
||
modified:
|
||
- src/Modules/Orders/OrdersRepository.php
|
||
|
||
key-decisions:
|
||
- "allegro_order_status_mappings index skipped — already has UNIQUE KEY on allegro_status_code"
|
||
- "Migration date 20260314 (execution date, not plan date)"
|
||
|
||
patterns-established:
|
||
- "Aggregating LEFT JOIN zamiast correlated subqueries dla countów/sum w listach"
|
||
- "Static property cache dla information_schema lookups"
|
||
|
||
duration: ~8min
|
||
started: 2026-03-14
|
||
completed: 2026-03-14
|
||
---
|
||
|
||
# Phase 7 Plan 01: Performance Fixes Summary
|
||
|
||
**Eliminacja N+1 subqueries w liście zamówień, static cache dla information_schema, indeksy wydajnościowe na tabeli orders**
|
||
|
||
## Performance
|
||
|
||
| Metric | Value |
|
||
|--------|-------|
|
||
| Duration | ~8min |
|
||
| Started | 2026-03-14 |
|
||
| Completed | 2026-03-14 |
|
||
| Tasks | 3 completed |
|
||
| Files modified | 2 (1 modified, 1 created) |
|
||
|
||
## Acceptance Criteria Results
|
||
|
||
| Criterion | Status | Notes |
|
||
|-----------|--------|-------|
|
||
| AC-1: Brak correlated subqueries w liście zamówień | Pass | 4 subqueries zastąpione aggregating LEFT JOINs; grep potwierdza zero `SELECT COUNT(*) FROM order_items WHERE oi.order_id` |
|
||
| AC-2: information_schema nie odpytywany per-request | Pass | `private static ?bool $supportsMappedMedia` + `self::$supportsMappedMedia` — max 1× na cykl PHP |
|
||
| AC-3: Brakujące indeksy dodane migracją | Pass | Migracja 000048: source, external_status_id, ordered_at, composite (source, external_status_id); IF NOT EXISTS |
|
||
|
||
## Accomplishments
|
||
|
||
- 4 correlated subqueries (items_count, items_qty, shipments_count, documents_count) → 3 aggregating LEFT JOINs — eliminacja ~200 dodatkowych zapytań przy 50 wierszach na stronę
|
||
- `canResolveMappedMedia()` z instance na static property — information_schema odpytywany max 1× na cykl PHP
|
||
- 4 brakujące indeksy na tabeli orders dla typowych filtrów/sortowań
|
||
|
||
## Files Created/Modified
|
||
|
||
| File | Change | Purpose |
|
||
|------|--------|---------|
|
||
| `src/Modules/Orders/OrdersRepository.php` | Modified | LEFT JOINs zamiast subqueries w buildListSql(); static cache w canResolveMappedMedia() |
|
||
| `database/migrations/20260314_000048_add_orders_performance_indexes.sql` | Created | Indeksy: source, external_status_id, ordered_at, composite (source, external_status_id) |
|
||
| `DOCS/DB_SCHEMA.md` | Modified | Wpis o migracji 000048 |
|
||
| `DOCS/TECH_CHANGELOG.md` | Modified | Wpis 2026-03-14 o optymalizacjach |
|
||
|
||
## Decisions Made
|
||
|
||
| Decision | Rationale | Impact |
|
||
|----------|-----------|--------|
|
||
| Pominięto indeks na allegro_order_status_mappings.allegro_status_code | Tabela już ma UNIQUE KEY na tej kolumnie (migracja 000025) | Brak duplikatu indeksu |
|
||
| Data migracji 20260314 zamiast 20260313 | Wykonanie w dniu 2026-03-14 | Numeracja zgodna z datą faktycznego utworzenia |
|
||
|
||
## Deviations from Plan
|
||
|
||
### Summary
|
||
|
||
| Type | Count | Impact |
|
||
|------|-------|--------|
|
||
| Auto-fixed | 0 | - |
|
||
| Scope additions | 0 | - |
|
||
| Deferred | 0 | - |
|
||
|
||
**Total impact:** Plan wykonany zgodnie ze specyfikacją. Jedyna różnica: pominięcie zbędnego indeksu na allegro_order_status_mappings (UNIQUE KEY już istniał).
|
||
|
||
## Issues Encountered
|
||
|
||
None
|
||
|
||
## Verification Results
|
||
|
||
```
|
||
✓ php -l src/Modules/Orders/OrdersRepository.php — No syntax errors
|
||
✓ grep correlated subqueries — 0 matches (eliminated)
|
||
✓ grep supportsMappedMedia — static + self:: confirmed
|
||
✓ Migration 000048 — exists, non-empty, idempotent (IF NOT EXISTS)
|
||
```
|
||
|
||
## Next Phase Readiness
|
||
|
||
**Ready:**
|
||
- OrdersRepository zoptymalizowany — lista zamówień gotowa na wzrost danych
|
||
- Plan 07-02 (SSL + cron + migration) niezależny, może być wykonany natychmiast
|
||
|
||
**Concerns:**
|
||
- Migracja 000048 wymaga uruchomienia na środowisku docelowym
|
||
|
||
**Blockers:**
|
||
- None
|
||
|
||
---
|
||
*Phase: 07-pre-expansion-fixes, Plan: 01*
|
||
*Completed: 2026-03-14*
|