Wer Drupal und dessen Modul Webform kennt hat einen kleinen Vorteil, es ist ein Modul zum freien Eintragen von Formularen und -einträgen. Ich habe sie gewarnt, doch Kunde wollte nicht hören - und nun muss ich versuchen, den Query eines Terminkalenders, welcher auf Webform-Einträgen basiert, zu optimieren - so lässt sich das Ding zur Zeit nicht benutzen.
Table webform_submitted_data
nid (formular-id), sid (eintrag-id) cid (feld-id) no (feld-teil) data (wert)
Folgendes ist mein derzeitiger Query:
bei mehreren tausend Einträgen nicht mehr verwaltbar, durch die mehreren Joins ist alles kaputt.
Ich suche nun eine Methode um das ganze zu verkürzen, es dauert viel zu lange.
Was mir ausserhalb von MySQL als Notbremse übrig bliebe, wäre SELECT * FROM webform_submitted_data (3 Sekunden pro Query), und dann via php weiterarbeiten und zu selektieren. Auch schlecht, aber immerhin laufend.
Bessere Vorschläge?
Oder gibt es keinen performanteren Weg, um den MySQL Server zu schützen?
Indizes:
Name Typ Kardinalität Feld
PRIMARY PRIMARY 510000 nid sid cid no
sid INDEX 30000 sid
no INDEX 3 no
Table webform_submitted_data
nid (formular-id), sid (eintrag-id) cid (feld-id) no (feld-teil) data (wert)
Folgendes ist mein derzeitiger Query:
Code:
SELECT DISTINCT main.`sid` FROM webform_submissions as main
INNER JOIN webform_submitted_data as y ON y.no = 2 AND main.sid = y.sid AND y.cid = '1179417776' AND y.data = '2007'
INNER JOIN webform_submitted_data as d ON main.sid = d.sid AND d.`no` = '1' AND d.`cid` = '1179417776'
INNER JOIN webform_submitted_data as m ON main.sid = d.sid AND m.`no` = '0' AND m.`cid` = '1179417776'
INNER JOIN webform_submitted_data as x ON main.sid = x.sid AND x.`cid` = '1179417857' AND x.`no` = '1'
INNER JOIN webform_submitted_data as z ON main.sid = z.sid AND z.`cid` = '1179417857' AND z.`no` = '0'
WHERE
(
(
( m.`data` < 11 OR ( m.`data` = 11 AND d.`data` <= 19 ) )
AND
( z.`data` > 11 OR ( z.`data` = 11 AND x.`data` >= 19 ) )
)
OR
(
( m.`data` < 11 OR ( m.`data` = 11 AND d.`data` <= 19 ) )
AND
( z.`data` > 11 OR ( z.`data` = 11 AND x.`data` >= 19 ) )
)
OR
(
( d.`data` >= 19 AND d.`data` <= 23 AND m.`data` >= 11 AND m.`data` <= 11 )
OR
( x.`data` <= 23 AND x.`data` >= 19 AND z.`data` >= 11 AND z.`data` <= 11 )
)
)
bei mehreren tausend Einträgen nicht mehr verwaltbar, durch die mehreren Joins ist alles kaputt.
Ich suche nun eine Methode um das ganze zu verkürzen, es dauert viel zu lange.
Was mir ausserhalb von MySQL als Notbremse übrig bliebe, wäre SELECT * FROM webform_submitted_data (3 Sekunden pro Query), und dann via php weiterarbeiten und zu selektieren. Auch schlecht, aber immerhin laufend.
Bessere Vorschläge?
Oder gibt es keinen performanteren Weg, um den MySQL Server zu schützen?
Indizes:
Name Typ Kardinalität Feld
PRIMARY PRIMARY 510000 nid sid cid no
sid INDEX 30000 sid
no INDEX 3 no