Hi,
ich habe eine recht komplexe Abfrage welche aber eigentlich nicht so langsam sein sollte wie sie gerade ist. Die Abfrage benötigt 3 Tabellen
ge_tool (278 Datensätze)
tool_id INT AUTOINC PRIMARY KEY
tool_number VARCHAR[50]
tool_status INT
ge_order (2400 Dateinsätze)
order_id INT AUTOINC PRIMARY KEY
order_startdate DATETIME
order_enddate DATETIME
order_jobnumber VARCHAR[50]
order_deleted INT
order_type INT
ge_ordertool (2900 Datensätze)
ordertool_order INT KEY
ordertool_tool INT KEY
ordertool_delivered DATETIME
ordertool_returned DATETIME
Folgendes Ergebnis soll die Abfrage haben:
6 Spalten mit den Werten
order_type
order_startdate
order_enddate,
order_jobnumber,
order_tools (alle für diesen Auftrag benötigten tool_number. Können beliebig viele sein)
order_status (Geplant, in Ausführung, Beendet, Gelöscht)
aller Aufträge innerhalb der letzten 12 Monate.
Im Moment dauert die Abfrage die ich habe bei der angegebenen Anzahl Datensätze ca 3-4 Sekunden. Das finde ich ziemlich lange angesichts der kleinen Menge an Datensätzen.
Was ich heraus finden konnte ist, dass der GROUP BY das Ganze so langsam macht. Nehme ich den raus ist es wieder im Bruchteil einer Sekunde fertig.
Was kann ich also tun? Kann ich das durch weitere Keys verbessern? Oder eventuell auch was an den mySQL Einstellungen ändern (MEhr Speicher etc?)
Danke
Claus
ich habe eine recht komplexe Abfrage welche aber eigentlich nicht so langsam sein sollte wie sie gerade ist. Die Abfrage benötigt 3 Tabellen
ge_tool (278 Datensätze)
tool_id INT AUTOINC PRIMARY KEY
tool_number VARCHAR[50]
tool_status INT
ge_order (2400 Dateinsätze)
order_id INT AUTOINC PRIMARY KEY
order_startdate DATETIME
order_enddate DATETIME
order_jobnumber VARCHAR[50]
order_deleted INT
order_type INT
ge_ordertool (2900 Datensätze)
ordertool_order INT KEY
ordertool_tool INT KEY
ordertool_delivered DATETIME
ordertool_returned DATETIME
Folgendes Ergebnis soll die Abfrage haben:
6 Spalten mit den Werten
order_type
order_startdate
order_enddate,
order_jobnumber,
order_tools (alle für diesen Auftrag benötigten tool_number. Können beliebig viele sein)
order_status (Geplant, in Ausführung, Beendet, Gelöscht)
aller Aufträge innerhalb der letzten 12 Monate.
Im Moment dauert die Abfrage die ich habe bei der angegebenen Anzahl Datensätze ca 3-4 Sekunden. Das finde ich ziemlich lange angesichts der kleinen Menge an Datensätzen.
Was ich heraus finden konnte ist, dass der GROUP BY das Ganze so langsam macht. Nehme ich den raus ist es wieder im Bruchteil einer Sekunde fertig.
Was kann ich also tun? Kann ich das durch weitere Keys verbessern? Oder eventuell auch was an den mySQL Einstellungen ändern (MEhr Speicher etc?)
Code:
$sql = "SELECT DISTINCT(ge_order.order_id) AS order_id, ge_order.order_startdate AS order_startdate, ge_order.order_enddate AS order_enddate, ge_order.order_jobnumber AS order_jobnumber, ge_tool.tool_status AS tool_status, GROUP_CONCAT(ge_tool.tool_number SEPARATOR '<br>') AS order_tools, IF(ge_order.order_deleted = 1,'".$orderStatusList['deleted']."', IF( ( SELECT COUNT(ge_ordertool.ordertool_order) FROM ge_ordertool WHERE ge_ordertool.ordertool_order = ge_order.order_id AND ge_ordertool.ordertool_delivered IS NOT NULL ) = 0 , '".$orderStatusList['planned']."', IF( ( SELECT COUNT(ge_ordertool.ordertool_order) FROM ge_ordertool WHERE ge_ordertool.ordertool_order = ge_order.order_id AND ge_ordertool.ordertool_returned IS NULL ) <> 0 , '".$orderStatusList['executing']."','".$orderStatusList['done']."'))) AS order_status, CASE ge_order.order_type "; $i=0; foreach($orderTypeStringList as $ordertype) { $sql.="WHEN ".$i." THEN '".$ordertype."' "; $i++; } $sql.= " END AS ordertype_name FROM ge_ordertool LEFT JOIN ge_order ON (ge_order.order_id=ge_ordertool.ordertool_order) LEFT JOIN ge_tool ON (ge_tool.tool_id=ge_ordertool.ordertool_tool) WHERE ge_order.order_enddate > DATE_SUB(CURDATE(), INTERVAL 1 YEAR) GROUP BY ge_ordertool.ordertool_order ";
Claus
Kommentar