Auch dann (oder dann erst recht) gibt es keinen wirklichen Grund für das "gib mir die kleinste freie Kundennummer". Denn dieses sollte von einem auto-numerischen Wert (stichwort auto increment) bereits und viel effizienter abgedeckt sein.
Gruss, Frank
Jap genau,
Wenn du die auto_increment Einstellung benutzt und zudem nichts löscht wie du selber sagst, dann sollte die nächste Höhere Zahl immer die freie Kundennummer sein.
Ansonsten macht SQL in deinem Fall 3 komplette Datenbank Scans. Einmal holt es sich die Daten für die Tabelle die du durchsuchen willst. Dann nochmal für den Subquery (wobei das ein wenig schneller gehen sollte, da die Daten bereits im Cache liegen. Und dann nochmals für die Range im Where. Zudem kann kein Index benutzt werden, da Range keinen Index benutzt.
Die Idee zur Optimierung wäre bei einer MyIsam Tabelle, dass du ALLE Daten in die Programmiersprache holst und dort die kleinstmögliche Kundennummer suchst. Zudem könntest du die zuletzt gefundene kleinste Kundennummer speichern, dann kannst du bei deiner nächsten Abfrage ab dieser Zahl suchen.
Beispiel in Pseudocode:
--------------
$arDaten = "select * from kunden where kundennummer > kleinste_zuletzt_gefundene_nummer"
foreach($arDaten)
{
$kleineKundenummer++
if($kleineKundenummer != $arDaten[$i]['kundenummer'])
break;
}
echo "dies ist die kleinste Kundenummer: ".$kleineKundenummer;
speichere_kleine_Kundenummer($kleineKundenummer);
--------------
Gruß
T-Rex