# ASP – Auslieferung der Performance-Anpassungen

Dieses Paket liefert SQL-Skripte für die neun im lokalen Docker ergänzten Indizes
sowie die optionale MariaDB-Cachekonfiguration. Es enthält **keinen vollständigen
Anwendungsrelease** und ändert keine PHP-Dateien oder Datenzeilen.

Ziel: **MariaDB 10.11, InnoDB**. Getestet mit MariaDB 10.11.18.
Nicht unverändert für MySQL oder ältere MariaDB-Versionen verwenden.
Datenbankname, Host und Zugangsdaten werden beim Verbinden gewählt; sie stehen
nicht in den SQL-Dateien. Die Skripte setzen vorhandene Anwendungstabellen voraus.

## Inhalt und Reihenfolge

1. `00-preflight.sql`: Version, Zieldatenbank, Tabellengrößen und bestehende Indizes prüfen.
2. `90-verify.sql`: vorab gleichnamige Indizes vergleichen; MISSING ist vor Installation normal.
3. `10-crawler-indexes.sql`: drei Indizes auf `t_auction_object`.
4. `20-error-indexes.sql`: zwei Indizes auf `t_auction_object_error`.
5. `30-history-indexes.sql`: vier Indizes auf `t_auction_object_history`.
6. `90-verify.sql`: abschließend müssen alle neun Zeilen OK melden.
7. `99-rollback-indexes.sql`: ausschließlich für einen bewusst gewählten Rückbau.
8. `99-asp-performance.cnf`: optionale Serverkonfiguration, kein SQL-Skript.

Die Apply-Skripte sind durch `IF NOT EXISTS` erneut ausführbar.
Gleichnamige vorhandene Indizes werden **nicht** auf ihre Definition geprüft oder
ersetzt. Deshalb vorab und danach `90-verify.sql` prüfen. Bei DIFFERENT stoppen
und den Konflikt separat klären. Meldungen über bereits vorhandene, korrekt
definierte Indizes sind bei Wiederholung zu erwarten.

## Vor einer Auslieferung

- Aktuelle Sicherung und funktionierende Wiederherstellung sicherstellen.
- Zielverbindung prüfen: `DATABASE()` darf nicht NULL sein und muss die beabsichtigte
  Anwendungsdatenbank bezeichnen. Alle drei Tabellen müssen existieren und InnoDB verwenden.
- Vorprüfungs-Ausgabe aufbewahren, besonders die bereits vorhandenen Indexnamen.
- Ausreichend freien Speicher auf Daten- und temporärem Dateisystem vorhalten.
  Der Aufbau großer Indizes braucht zusätzlichen Platz, CPU und I/O.
- In einem ruhigen Zeitfenster ausführen. LOCK=NONE erlaubt parallele Zugriffe,
  trotzdem können kurze Metadatenlocks entstehen. Lange offene Transaktionen vorher prüfen.
- Benötigt wird ein Datenbankkonto mit ALTER-Rechten auf den drei Zieltabellen.
- DDL führt implizite Commits aus. Ein Fehler im späteren Skript macht die vorherigen
  Änderungen nicht automatisch rückgängig. Fehler nicht mit `--force` übergehen.
- `lock_wait_timeout=30` begrenzt das Warten auf Metadatenlocks, nicht die Dauer
  des eigentlichen Indexaufbaus. Kein automatischer Fallback auf eine sperrende Kopie.

## Manuelle Ausführung über den MariaDB-Client

Aus dem entpackten Paketverzeichnis verbinden. `-p` fragt das Passwort ab;
kein Passwort in Skripte oder Befehlszeilen schreiben:

```sh
mariadb --host=DB_HOST --port=3306 --user=DEPLOY_USER -p --abort-source-on-error ZIELDATENBANK
```

Danach im Client einzeln ausführen und die Ausgaben prüfen:

```sql
SOURCE 00-preflight.sql;
SOURCE 90-verify.sql;
-- Nur fortfahren, wenn Ziel und Vorbedingungen stimmen und kein DIFFERENT vorliegt.
SOURCE 10-crawler-indexes.sql;
SOURCE 20-error-indexes.sql;
SOURCE 30-history-indexes.sql;
SOURCE 90-verify.sql;
```

SOURCE-Pfade beziehen sich auf den Rechner beziehungsweise Container, auf dem
der Client läuft. **Nicht alle *.sql-Dateien automatisch importieren:** Das würde
auch das Rückbau-Skript ausführen.

### Im vorhandenen Docker-Setup

Im Projektverzeichnis:

```powershell
docker compose cp deployment/performance db:/tmp/asp-performance-2026-09-03
docker compose exec db mariadb --user=asp -p --abort-source-on-error redaktionsDB
```

Im Client die obigen SOURCE-Befehle mit vollständigem Pfad verwenden, beispielsweise:

```sql
SOURCE /tmp/asp-performance-2026-09-03/00-preflight.sql;
```

Die bestehenden Docker-Indizes müssen nicht erneut aufgebaut werden.
Ein Neustart ist nach dem Anlegen der Indizes nicht nötig.

## Optionale Serverkonfiguration – separat ausführen

`99-asp-performance.cnf` enthält `innodb_buffer_pool_size=512M`.
512 MB wurden für das lokale Docker mit insgesamt rund 2 GB RAM gewählt.
Auf einem Zielserver anhand des verfügbaren RAM und anderer Dienste dimensionieren.

Unter Debian/MariaDB die Datei beispielsweise nach
`/etc/mysql/mariadb.conf.d/99-asp-performance.cnf` installieren. Vorher bestehende
Einstellungen prüfen und sichern; doppelte widersprüchliche Werte vermeiden.
Die Datei dauerhaft per Deployment beziehungsweise Docker-Mount/Image bereitstellen,
nicht ausschließlich in die beschreibbare Containerschicht kopieren.

Ein Administrator kann den Wert ohne Neustart aktivieren:

```sql
SET GLOBAL innodb_buffer_pool_size = 536870912;
SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size';
```

SET GLOBAL allein ist nicht dauerhaft. Die Konfigurationsdatei gilt für folgende
Starts. Alternativ MariaDB nach einem geplanten Wartungsfenster neu starten.
Rückbau: die zuvor gesicherte Konfiguration und den vorherigen Laufzeitwert
wiederherstellen; der Ausgangswert des lokalen Docker war 134217728 Bytes.

## Zusammenhang mit dem Anwendungscode

Die volle gemessene Beschleunigung erfordert zusätzlich die bereits in Docker
geänderten Ajax-Controller: `AuctionObjectsOverviewController.php` und
`AuctionObjectsErrorOverviewController.php` mit Zählabfragen ohne unnötige Joins
und Sortierung nach echten Zeitstempeln statt formatierten Anzeigetexten.
Für die Historie gehören auch deren zuvor angepasste Ajax- und Seitencontroller dazu.
Die Indizes allein ersetzen diese Codeänderungen nicht.

Die Docker-Code-Sicherung liegt unter
`/var/www/html/storage/app/asp-php82-recovery/patched-code.tar.gz`.
Sie enthält auch ältere PHP-8.2-Kompatibilitätsänderungen. **Nicht ungeprüft auf
eine abweichende Anwendungsversion entpacken.** Dieses SQL-Paket macht Laravel 5.8
nicht zu einem unterstützten oder geprüften Produktionsrelease.

## Kontrolle und Rückbau

Nach der Auslieferung Filterkombinationen, leere Ergebnisse, Suche, Sortierung
und mindestens die erste und zweite Tabellenseite testen. Trefferzahlen und IDs
mit dem bisherigen Datenbestand vergleichen; die Zeitstempelsortierung ist jetzt
chronologisch, bei gleichen Zeitstempeln entscheidet die ID.

Ein Rückbau wird nicht automatisch ausgeführt. Vor Ausführung von
`99-rollback-indexes.sql` die DROP-Klauseln für alle schon vor diesem Deployment
vorhandenen Indizes entfernen. Das Skript kennt deren Herkunft nicht.
Der Rückbau entfernt nur Indizes, keine Tabellen oder Datenzeilen; Abfragen können
danach wieder langsamer werden. Die Cachekonfiguration separat zurücksetzen.

