Moin!
ich habe eine Datenbank und da möchte ich die Datenbank optimieren, und zwar nicht belegte positionsnummern löschen und alle darauffolgenden zurückzählen.
Warum nur? Sollte nicht jeder Datenbankeintrag eine lebenslang eindeutige ID besitzen? Naja, mag sein, daß du nur irgendwelche Sekundärmerkmale schöner sortiert haben willst, kann ja vorkommen.
folgender Quelltext:
...der mir suspekt vorkommt - dummerweise je länger ich schaue, umso mehr verstehe ich, aber umso böser scheint er mir.
Ich kommentiere einfach mal:
function db_opt($table,$value_to_optimize){
$val = $value_to_optimize;
Das ist eine reichlich sinnlose Zuweisung. Wenn du zum Tippen langer Variablennamen zu faul bist, definiere in der Funktionsdefinition kurze Variablennamen. ;)
$ok = false;
$i = 0;
while(!$ok){
Diese Schleife ist irgendwie böse, weil:
$sql = "SELECT ".$val." FROM ".$table;
$facts = $this->sqlarray($sql);
Es wird sehr häufig ein SELECT ausgeführt - eben solange, bis in mehreren Durchläufen sortiert wurde... schlecht organisiert!
$max = count($facts);
echo "$facts -> $max";
if(($facts) && ($i<$max)){
if(($facts[$i]+1) < ($facts[$i+1])){
$interval = $facts[$val][$i+1] - $facts[$i] -1;
$sql = "UPDATE ".$table." SET ".$val." = ".$val;
Außerdem werden noch UPDATEs dazwischengestreut - wenn du der einzige "in" der Datenbank bist, und das Sortieren gerade das einzige ist, was du machst, gehts wohl noch - aber es ist doch sehr unperformant.
$sql.= " - ".$interval." where ".$val." > ".$facts[$i];
$this->sqlquery($sql);
}
$i++;
}else{
$ok = true;
}
}
}
folgende Ausgabe:
Die ignoriere ich einfach mal, weil ich deinen Ansatz zum Ordnen schon schlecht finde.
Hier mal meine Idee kurz skizziert:
Du machst ein SELECT auf die Tabelle:
SELECT spalte FROM tabelle ORDER BY spalte ASC
Du erhälst die nach Spalte aufsteigend sortierte Tabelle.
while ($sort[]=mysql_fetch_array(...))
Du liest alle Spalten in ein Array ein. Die hier angewandte Art des einlesens ist ein Special: Das erste Element ist $sort[0], die weiteren Elemente werden einfach hinten angehängt.
Deine Spalte hat (hoffentlich) eine Integer-Zahl, genau wie der Array-Index auch.
Folglich ist das Array indexmäßig beginnend bei Null sortiert, und enthält als Werte die lückenhaften Einträge deiner Tabelle.
Du gehst einfach alle Arrayelemente durch und änderst bei denen, die aus der Reihe tanzen, den in der DB gespeicherten Index:
for ($i=0; $i<count($sort); $i++)
{
if ($i <> $sort[$i])
{
UPDATE tabelle SET spalte = $i WHERE spalte=$sort[$i]
// neuer Wert ^^ ^^ alter Wert
}
}
Fertig.
Ist natürlich kein fertiger PHP-Code, sondern nur schematisch - aber er sollte den Weg zeigen.
Vorteil: Nur ein einziges SELECT, und nur soviele UPDATEs, wie wirklich nötig sind.
- Sven Rautenberg