Query verkorten/versnellen
Ik heb onderstaande query.
Die werkt prima, in delen.
Theoretisch zou het ook gewoon moeten werken (met één AND ... NOT IN () werkt het wel, maak niet uit welke), maar phpMyAdmin geeft een heerlijke timeout.
Ook via php direct gebeurt dat.
Uiteraard is dit niet goed opgezet en van normalisatie heeft de database ook nooit gehoord. En ja: het is Mysql op MyIsam.
De database is 5 jaar geleden opgezet en opgestart en in die tijd stevig vervuild.
De query klopt zoals hieronder, maar is gewoon te traag.
Wie kan mij helpen hem te versnellen?
Die werkt prima, in delen.
Theoretisch zou het ook gewoon moeten werken (met één AND ... NOT IN () werkt het wel, maak niet uit welke), maar phpMyAdmin geeft een heerlijke timeout.
Ook via php direct gebeurt dat.
Uiteraard is dit niet goed opgezet en van normalisatie heeft de database ook nooit gehoord. En ja: het is Mysql op MyIsam.
De database is 5 jaar geleden opgezet en opgestart en in die tijd stevig vervuild.
De query klopt zoals hieronder, maar is gewoon te traag.
Wie kan mij helpen hem te versnellen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
SELECT o.OrganisatieId, o.Naam, g.Account, g.Email, g.Nivo, g.NrIngelogd, g.Tijdstip_vorig
FROM tblOrganisatie AS o
LEFT JOIN tblGebruiker AS g
ON (g.OrganisatieId = o.OrganisatieID)
LEFT JOIN tblOrgPagina AS p
ON (o.OrganisatieId = p.OrganisatieID)
WHERE o.OrganisatieID IN
(
SELECT op.OrganisatieId
FROM tblOrgPagina AS op
WHERE op.datum_update = '00-00-00 00:00:00'
AND op.OrganisatieId > 0
AND op.OrganisatieId NOT IN
(
SELECT OrganisatieId
FROM tblOrgPagina
WHERE datum_update <> '00-00-00 00:00:00'
GROUP BY OrganisatieId
)
AND op.OrganisatieId NOT IN
(
SELECT a.OrganisatieId
FROM tblActiviteit AS a
WHERE a.DatumToe < NOW() - INTERVAL 6 MONTH
AND a.OrganisatieId > 0
GROUP BY a.OrganisatieId
)
AND op.OrganisatieId NOT IN
(
SELECT n.OrganisatieId
FROM tblNieuwsArtikel AS n
WHERE n.DatumToe < NOW() - INTERVAL 6 MONTH
AND n.OrganisatieId > 0
GROUP BY n.OrganisatieId
)
GROUP BY op.OrganisatieId
ORDER BY op.datum_update ASC
)
AND p.datum_update = '00-00-00 00:00:00'
GROUP BY o.OrganisatieId
ORDER BY g.Tijdstip_vorig
LIMIT 0, 100
?>
SELECT o.OrganisatieId, o.Naam, g.Account, g.Email, g.Nivo, g.NrIngelogd, g.Tijdstip_vorig
FROM tblOrganisatie AS o
LEFT JOIN tblGebruiker AS g
ON (g.OrganisatieId = o.OrganisatieID)
LEFT JOIN tblOrgPagina AS p
ON (o.OrganisatieId = p.OrganisatieID)
WHERE o.OrganisatieID IN
(
SELECT op.OrganisatieId
FROM tblOrgPagina AS op
WHERE op.datum_update = '00-00-00 00:00:00'
AND op.OrganisatieId > 0
AND op.OrganisatieId NOT IN
(
SELECT OrganisatieId
FROM tblOrgPagina
WHERE datum_update <> '00-00-00 00:00:00'
GROUP BY OrganisatieId
)
AND op.OrganisatieId NOT IN
(
SELECT a.OrganisatieId
FROM tblActiviteit AS a
WHERE a.DatumToe < NOW() - INTERVAL 6 MONTH
AND a.OrganisatieId > 0
GROUP BY a.OrganisatieId
)
AND op.OrganisatieId NOT IN
(
SELECT n.OrganisatieId
FROM tblNieuwsArtikel AS n
WHERE n.DatumToe < NOW() - INTERVAL 6 MONTH
AND n.OrganisatieId > 0
GROUP BY n.OrganisatieId
)
GROUP BY op.OrganisatieId
ORDER BY op.datum_update ASC
)
AND p.datum_update = '00-00-00 00:00:00'
GROUP BY o.OrganisatieId
ORDER BY g.Tijdstip_vorig
LIMIT 0, 100
?>
Gesponsorde koppelingen:
Er zijn nog geen reacties op dit bericht.



