Möglichkeit das Script schneller zu machen?

Thomas_Jung

Erfahrenes Mitglied
Hallo

Folgendes Script soll in der Tabelle datenbank nachsehen ob der Lagerort (Lager Regal Höhe Fach)
bereits belegt ist.

Folgendes Script braucht für 10 Datensätze 53.9147510529 Sekunden
Muss ich das so Akzeptieren oder gibt es eine andere Möglichkeit das Script schneller zu machen?

PHP:
	$sql_first=mysql_query("SELECT Lager, Regal, Höhe, Fach FROM lagerverwaltung ")

	while($row = mysql_fetch_array($sql_first)) {

	$sql = mysql_query("SELECT Lager, Regal, Höhe, Fach FROM datenbank WHERE ( (Lager = '". $row['Lager'] ."') and  (Regal = '". $row['Regal'] ."') and  (Höhe = '". $row['Höhe'] ."') and  (Fach = '". $row['Fach'] ."' ) ) ");

	$sql_meter = mysql_query("SELECT SUM(Meter) FROM datenbank WHERE ( (Lager = '". $row['Lager'] ."') and  (Regal = '". $row['Regal'] ."') and  (Höhe = '". $row['Höhe'] ."') and  (Fach = '". $row['Fach'] ."' ) ) ");

	$totalRows = mysql_num_rows($sql);

    if($totalRows > 0) {  $anzahl_meter = mysql_fetch_array($sql_meter);

    $sql_update = mysql_query("update lagerverwaltung set Belegt='1', Datensätze='".$totalRows."', Anzahl_Meter='".$anzahl_meter[0]."' where  ( (Lager = '". $row['Lager'] ."') and  (Regal = '". $row['Regal'] ."') and  (Höhe = '". $row['Höhe'] ."') and  (Fach = '". $row['Fach'] ."' ) ) ");

    }
 
PHP:
<?php
$sql_first=mysql_query("SELECT Lager, Regal, Höhe, Fach FROM lagerverwaltung ")

    while($row = mysql_fetch_array($sql_first)) {

    $sql = mysql_query("SELECT Lager, Regal, Höhe, Fach, SUM(Meter) as gesamt FROM datenbank WHERE ( (Lager = '". $row['Lager'] ."') and  (Regal = '". $row['Regal'] ."') and  (Höhe = '". $row['Höhe'] ."') and  (Fach = '". $row['Fach'] ."' ) ) ");

    $totalRows = mysql_num_rows($sql);

    if($totalRows > 0) {  
    $sql_update = mysql_query("update lagerverwaltung set Belegt='1', Datensätze='".$totalRows."', Anzahl_Meter='".$row['gesamt']."' where  ( (Lager = '". $row['Lager'] ."') and  (Regal = '". $row['Regal'] ."') and  (Höhe = '". $row['Höhe'] ."') and  (Fach = '". $row['Fach'] ."' ) ) ");

    } 
?>
Ungetestet, aber ich denke es könnte so funktionieren.
 
Hallo
Flex / Gumbo

Es gibt 2 Tabellen
Lagerverwaltung mit den Feldern
id, Lager, Regal, Höhe, Fach, Meter, Fach_Art, Belegt, Datensätze, Anzahl_Meter

Datenbank mit den Feldern
id, Firma, AFID, Lager, Regal, Höhe, Fach, Meter

In der Tabelle datenbank befinden sich Kartons in jedem Fach.
z.b
In dem Lager 1 im Regal 1 in der Höhe 1 im Fach 1 befinden sich 5 Kartons.
Das währen 5 Datensätze (pro Artikel/Karton einen Datensatz) mit mindestens 1 - 5 Meter

Nun soll in der Tabelle lagerverwaltung
das Lager 1 Regal 1 Höhe 1 Fach 1 als belegt markiert werden,
die Anzahl der Datensätze eingetragen werden und die Summe der Meter
(Die Menge/Summe der Meter wird je nach Kartongröße pro Fach vergeben)

Ich hoffe ich konnte das einigermaßen erklären.

Gruß Thomas

p.s

[Flex]
Information: Beim Ausführen des Skriptes ist ein Fehler aufgetreten.
MySQL Fehler Nummer: 1140
MySQL Fehler Bezeichnung: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Verwende ich GROUP BY Lager, Regal, Höhe, Fach gibt das ein Leistungszuwachs von 50%.
 
Zuletzt bearbeitet:
Du solltest dein Datenbankschema überarbeiten, da „Lager“, „Regal“, „Höhe“, „Fach“ und „Meter“ redundante Informationen sind, die bereits in der Datenbank „Lagerverwaltung“ stehen und somit in „Datenbank“ überflüssig sind. Eine einfache numerische ID könnte hier die Relation zwischen beiden Datenbanken übernehmen.
 
Hallo Gumbo
Ich soll nachträglich zu der Datenbank (825.000 Datensätze) eine Lagerverwaltung erstellen.

Das Script macht ja genau das was ich will :)
aber es dauert bei 45.368 Datensätze in der Lagerverwaltung zulange :mad:.


Hättest du eine klitzekleines Datenbankschema / Anregung für mich?

Gruß Thomas
 
Probier dochmal statt:

PHP:
$sql = mysql_query("SELECT Lager, Regal, Höhe, Fach FROM datenbank WHERE ( (Lager = '". $row['Lager'] ."') and  (Regal = '". $row['Regal'] ."') and  (Höhe = '". $row['Höhe'] ."') and  (Fach = '". $row['Fach'] ."' ) ) ");

...lieber....

PHP:
$sql = mysql_query("SELECT Lager, Regal, Höhe, Fach FROM datenbank WHERE MATCH  (Lager) AGAINST ". $row['Lager'] ." OR (oder AND) 
MATCH ( (Regal) AGAINST ". $row['Regal'] ." ........ usw.;

dafür musst du aber einen Fulltext index über die jeweiligen Spalten legen.
Ich weiß allerdings nicht genau, ob die Leistung dadurch verbesert wird.
Die MATCH Suche hat durch die Indizierung bessere Sucheigenschaften, das kannst du aber auch noch alles nachlesen.
 
Zuletzt bearbeitet:
Grundsätzlich solltest du über alle Felder, die du in den WHERE-Bedingungen hast, einen INDEX anlegen... Das sollte das Tempo auch nochmal erhöhen...
 
Was für eine Beziehung hast du zwischen den Tabellen?

Wenn ich so die wehre klausel seh muß da was bei der Datenbank Beziehung schief gelaufen sein. Es werden ja fast alle splaten der Tabelle mit der anderen verglichen.

Ich kenn zwar nicht den Aufbau deiner Db aber so wie sich das Anhört brauchst du dafür einen n/m beziehung

Sql bei eine n/m Beziehung:
SELECT datenbank.Lager, datenbank.Regal, datenbank.Höhe, datenbank.Fach,Lagerverwaltung.Lager,Lagerverwaltung.Regal,Lagerverwaltung.Höhe FROM datenbank,Lagerverwaltung WHERE Lagerverwaltung.Id = datenbank.F_id

Übrings ist es immer schlecht wenn man in 2 Verschiedenen tabellen die gleichen spaltennamen benutz es geht zwar auch.Aber macht das ganze sehr unübersichtlich zudem muß dann jede spalte mit dem tabellenamen angesprochen werden.

Das was vermutlich bei dir fehlt ist eine Tabele zwischen Datenbank und Lagerverwaltung
Hinweis: für die n/m Beziehung sind 3 tabellen notwendig

Nachträglich sowas zu Koregieren ist nicht einfach und sehr mühsam. Aber dann würde die Abfrag demensprechen schnell ablaufen
Mit deinen oben laufen script weres es villeicht möglich die fehlende Tabelle automatisch zu erstellen lassen wenn das script bist auch zum ende durchläuft.
 
Zuletzt bearbeitet:
Zurück