hi,
ik heb een tijdendatabase waaruit ik een ranglijst creeer met behulp van een mysql query. ik ben echter niet erg te spreken over de snelheid van deze query. ben nu al een aantal dagen bezig uit te zoeken hoe ik een en ander zou kunnen optimaliseren; heb nu ong een halve seconde tijdswinst weten te boeken, maar vind de 2.5 sec die resteren voor de query op mijn test server nog steeds veel te lang.
om een en ander wat duidelijker te maken eerst even wat code:
doel is om op basis van deze data een mooie ranglijst te creeeren. iemand wordt echter alleen opgenomen in de ranglijst indien hij/zijn de 4 afstanden die in de query vermeld worden (3, 5, 7 en
verreden heeft. zoals het nu is komt er dus veel zinloze data terug, die later met behulp van een php script opgeschoond wordt, zodanig dat enkel die personen over blijven die aan de bovestaanden voorwaarde voldoen.
op basis van de explain denk ik dat ik er van uit mag gaan dat het wel goed zit wat betreft het gebruik van indexes. naar mijn idee zijn er dan nog twee zaken die ik zou kunnen doen om een en ander nog beter te laten draaien.
1. zorgen dat er geen gebruik meer wordt gemaakt van temporary en filesort
2. zorgen dat de grote hoeveelheid 'onzinnige' output die ik krijg verminderd.
@1: Ik heb geen idee hoe dit aan te pakken. Van de docs begrijp ik dat de een veroorzaakt wordt door de group by en de ander door de order by. Daarnaast weet ik dat deze sorting methodes verantworodelijk zijn voor performace verlies. Ik kan echter niet vinden hoe dit te ontlopen. Is er een mooie (snelle) oplossing met mySQL of moet ik een en ander maar gewoon niet gesorteerd later terug komen en die zelf doen met behulp van een stukje php code?
@2: Een subquery lijkt me hier een optie voor, maar helaas gebruik ik geen MySQL 4.1 (hoster wil niet), dus dit is niet echt een optie.
Heb zelf geprobeerd een en ander aan te pakken met een paar SELF JOINs, maar dat slikte mysql niet. Een vriend stelde een oplossing met EQUI JOINs voor, maar die query duurde zolang dat ik op een gegeven moment mijn sql server maar gerest heb..
Iemand die hier ideeen voor heeft?
ik heb een tijdendatabase waaruit ik een ranglijst creeer met behulp van een mysql query. ik ben echter niet erg te spreken over de snelheid van deze query. ben nu al een aantal dagen bezig uit te zoeken hoe ik een en ander zou kunnen optimaliseren; heb nu ong een halve seconde tijdswinst weten te boeken, maar vind de 2.5 sec die resteren voor de query op mijn test server nog steeds veel te lang.
om een en ander wat duidelijker te maken eerst even wat code:
code:
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
47
48
49
50
51
52
53
54
55
56
57
| $query:
¯¯¯¯¯¯
SELECT
leden.geslacht,
CONCAT_WS(' ', leden.voornaam, leden.tussen, leden.achternaam) AS naam,
afstand.omschrijving AS afstand,
MIN(overzicht.tijd) AS tijd
FROM
tijd_overzicht AS overzicht
LEFT JOIN tijd_verbinding AS verbinding ON verbinding.verbinding_id = overzicht.verbinding_id
LEFT JOIN leden AS leden ON leden.leden_id = overzicht.leden_id
INNER JOIN tijd_afstand AS afstand ON afstand.afstand_id = verbinding.afstand_id
WHERE
verbinding.afstand_id IN (3,5,7,8)
AND overzicht.tijd <> 0
AND overzicht.opmerking_id NOT IN (3,4)
AND leden.geslacht <> 'onbekend'
GROUP BY
verbinding.afstand_id,
overzicht.leden_id
ORDER BY
leden.geslacht DESC,
overzicht.leden_id,
afstand.meters;
EXPLAIN $query:
¯¯¯¯¯¯¯¯¯¯¯¯¯¯
+------------+--------+-----------------------+---------+---------+-------------------------+-------+---------------------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+------------+--------+-----------------------+---------+---------+-------------------------+-------+---------------------------------------------+
| overzicht | ALL | NULL | NULL | NULL | NULL | 18043 | where used; Using temporary; Using filesort |
| verbinding | eq_ref | PRIMARY,verbinding_id | PRIMARY | 2 | overzicht.verbinding_id | 1 | where used |
| leden | eq_ref | PRIMARY,leden_id | PRIMARY | 2 | overzicht.leden_id | 1 | where used |
| afstand | eq_ref | PRIMARY,afstand_id | PRIMARY | 1 | verbinding.afstand_id | 1 | |
+------------+--------+-----------------------+---------+---------+-------------------------+-------+---------------------------------------------+
4 rows in set (0.06 sec)
$query LIMIT 10:
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
+----------+-------------------------+---------+--------+
| geslacht | naam | afstand | tijd |
+----------+-------------------------+---------+--------+
| vrouw | Persoon 1 | 500m | 47.37 |
| vrouw | Persoon 1 | 1.500m | 141.52 |
| vrouw | Persoon 1 | 5.000m | 552.64 |
| vrouw | Persoon 2 | 500m | 51.41 |
| vrouw | Persoon 2 | 1.500m | 156.10 |
| vrouw | Persoon 3 | 500m | 45.90 |
| vrouw | Persoon 3 | 1.500m | 137.92 |
| vrouw | Persoon 4 | 500m | 55.80 |
| vrouw | Persoon 4 | 1.500m | 187.82 |
| vrouw | Persoon 5 | 500m | 48.62 |
+----------+-------------------------+---------+--------+
10 rows in set (2.42 sec) |
doel is om op basis van deze data een mooie ranglijst te creeeren. iemand wordt echter alleen opgenomen in de ranglijst indien hij/zijn de 4 afstanden die in de query vermeld worden (3, 5, 7 en
op basis van de explain denk ik dat ik er van uit mag gaan dat het wel goed zit wat betreft het gebruik van indexes. naar mijn idee zijn er dan nog twee zaken die ik zou kunnen doen om een en ander nog beter te laten draaien.
1. zorgen dat er geen gebruik meer wordt gemaakt van temporary en filesort
2. zorgen dat de grote hoeveelheid 'onzinnige' output die ik krijg verminderd.
@1: Ik heb geen idee hoe dit aan te pakken. Van de docs begrijp ik dat de een veroorzaakt wordt door de group by en de ander door de order by. Daarnaast weet ik dat deze sorting methodes verantworodelijk zijn voor performace verlies. Ik kan echter niet vinden hoe dit te ontlopen. Is er een mooie (snelle) oplossing met mySQL of moet ik een en ander maar gewoon niet gesorteerd later terug komen en die zelf doen met behulp van een stukje php code?
@2: Een subquery lijkt me hier een optie voor, maar helaas gebruik ik geen MySQL 4.1 (hoster wil niet), dus dit is niet echt een optie.
Heb zelf geprobeerd een en ander aan te pakken met een paar SELF JOINs, maar dat slikte mysql niet. Een vriend stelde een oplossing met EQUI JOINs voor, maar die query duurde zolang dat ik op een gegeven moment mijn sql server maar gerest heb..
Iemand die hier ideeen voor heeft?
Through meditation I program my heart to beat breakbeats and hum basslines on exhalation -Blackalicious || *BetuweKees was AFK; op de fiets richting China en verder