# MySQL Keys Cleanup - Anleitung

## Problem
Der MySQL-Server hat ein Limit von maximal 64 Keys pro Tabelle. Sequelize erstellt automatisch viele INDEX für verschiedene Felder, was dieses Limit überschreitet.

## Wichtige Erkenntnis ⚠️
**Alle INDEX-Namen in den ursprünglichen Scripts existieren nicht!** Das bedeutet, dass die Tabellennamen oder INDEX-Namen nicht mit der Realität übereinstimmen.

## Lösung
Das Cleanup-Script entfernt überflüssige INDEX, behält aber die essentiellen Keys (PRIMARY KEY, UNIQUE Keys).

## Verfügbare Scripts (nach Priorität sortiert)

### **1. `checkRealIndexes.sql`** - Echte INDEX überprüfen ⭐ EMPFOHLEN ZUERST
- Zeigt alle vorhandenen Tabellen in der Datenbank an
- Zeigt alle **echten** INDEX und Keys an
- Zeigt die Anzahl der Keys pro Tabelle an
- **Verwenden Sie dieses Script zuerst, um die echten INDEX-Namen zu sehen!**

### **2. `cleanupKeysMinimal.sql`** - Minimales Cleanup ⭐ EMPFOHLEN
- Zeigt alle INDEX pro Tabelle mit `SHOW INDEX`
- Entfernt alle überflüssigen INDEX
- Behält nur PRIMARY KEY und UNIQUE Keys
- **Sicherste Option für die Bereinigung**

### **3. `cleanupKeysReal.sql`** - Cleanup mit echten Namen
- Zeigt alle vorhandenen INDEX vor und nach der Bereinigung
- Entfernt nur INDEX, die tatsächlich existieren
- Detaillierte Informationen über den Cleanup-Prozess

### **4. `checkTableNames.sql`** - Tabellennamen überprüfen
- Zeigt alle vorhandenen Tabellen und INDEX an
- Gute Übersicht über die Datenbankstruktur

### **5. `cleanupKeysSmart.sql`** - Intelligentes Cleanup (veraltet)
- Überprüft zuerst alle vorhandenen Tabellen und INDEX
- **Problem**: Verwendet falsche INDEX-Namen

### **6. `cleanupKeysCorrected.sql`** - Korrigierte Tabellennamen (veraltet)
- Verwendet die wahrscheinlich korrekten Tabellennamen
- **Problem**: Verwendet falsche INDEX-Namen

### **7. `cleanupKeys.sql` & `cleanupKeysSimple.sql`** (veraltet)
- Tabellennamen und INDEX-Namen könnten falsch sein
- **Nicht mehr empfohlen**

## Empfohlener Ablauf

### **Schritt 1: Echte INDEX überprüfen**
```bash
# Verbindung zur MySQL-Datenbank
mysql -u [username] -p [database_name]

# Script ausführen
source /path/to/checkRealIndexes.sql
```

### **Schritt 2: Minimales Cleanup durchführen**
```bash
# Script ausführen
source /path/to/cleanupKeysMinimal.sql
```

### **Alternative Ausführungsmethoden**

#### Über MySQL Workbench
1. MySQL Workbench öffnen
2. Verbindung zur Datenbank herstellen
3. File -> Open SQL Script -> Script auswählen
4. Execute (Blitz-Symbol) klicken

#### Über phpMyAdmin
1. phpMyAdmin öffnen
2. Datenbank `trainingsdiary` auswählen
3. SQL-Tab öffnen
4. Inhalt des Scripts einfügen
5. Go klicken

## Nach der Ausführung

1. **Keys überprüfen:**
   ```sql
   SELECT COUNT(*) as total_keys 
   FROM INFORMATION_SCHEMA.STATISTICS 
   WHERE TABLE_SCHEMA = 'trainingsdiary';
   ```

2. **Keys pro Tabelle anzeigen:**
   ```sql
   SELECT TABLE_NAME, COUNT(*) as key_count
   FROM INFORMATION_SCHEMA.STATISTICS 
   WHERE TABLE_SCHEMA = 'trainingsdiary' 
   GROUP BY TABLE_NAME
   ORDER BY key_count DESC;
   ```

3. **Server neu starten:**
   ```bash
   npm run dev
   ```

## Wichtige Hinweise

- **Backup erstellen:** Vor der Ausführung ein Backup der Datenbank erstellen
- **Nur essentiellste Keys:** Das Script behält PRIMARY KEY und UNIQUE Keys bei
- **Performance:** Weniger Keys können die Abfrage-Performance beeinflussen
- **Sequelize:** Nach dem Cleanup kann Sequelize die Keys bei Bedarf neu erstellen

## Empfohlener Ablauf

1. **`checkRealIndexes.sql` ausführen** - Echte INDEX-Namen sehen
2. **`cleanupKeysMinimal.sql` ausführen** - Minimales Cleanup
3. **Ergebnisse überprüfen** - Keys zählen
4. **Server neu starten** - `npm run dev`

## Troubleshooting

### Fehler: "Can't DROP INDEX; check that it exists"
- **Das ist normal!** Alle INDEX-Namen in den ursprünglichen Scripts existieren nicht
- Verwenden Sie `checkRealIndexes.sql` um die echten INDEX-Namen zu sehen
- Verwenden Sie `cleanupKeysMinimal.sql` für das Cleanup

### Fehler: "Table doesn't exist"
- Verwenden Sie `checkRealIndexes.sql` um die echten Tabellennamen zu sehen
- Passen Sie die Scripts entsprechend an

### Fehler: "Index doesn't exist"
- Das ist normal - `DROP INDEX IF EXISTS` verhindert Fehler
- Nicht vorhandene INDEX werden einfach übersprungen

### Keys werden immer noch erstellt
- Sequelize erstellt Keys automatisch bei `sync()`
- Das ist normal und gewünscht
- Nur überflüssige Keys werden entfernt

### MySQL-Key-Limit überschritten
- Führen Sie das minimale Cleanup-Script aus
- Überprüfen Sie die Anzahl der Keys nach der Bereinigung
- Falls nötig, entfernen Sie weitere INDEX manuell basierend auf den echten Namen
