This commit is contained in:
2026-03-14 01:10:29 +01:00
parent ac0e07916e
commit 62a68e9ec2
23 changed files with 908 additions and 239 deletions

View File

@@ -0,0 +1,122 @@
---
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*