Mijn kennis van PHP/SQL is basic, maar altijd genoeg geweest voor wat ik wilde. Voornamelijk input naar een database, en output uit de database in een HTML tabel.
Echter loop ik nu tegen het probleem aan dat een query erg traag loopt, ik zal hieronder de situatie schetsen en de relevante code plaatsen.
Op dit moment duurt de query voor alleen vandaag (41 agents, 7 types) 16 seconden. Een maand overzicht (220 agents, 20 types) duurt 120 seconden, zonder het parsen van de highcharts grafiek.
Ik heb een MySQL table met daarin data vanuit een web formulier. Relevante velden zijn id, agent, date en type. Een voorbeeld zou zijn:
Wat ik wil, is op een pagina een HTML table weergeven met daarin de count per agent, per type. Deze HTML tabel wordt vervolgens gebruikt voor een Hhighcharts grafiek. Het addertje echter is dat de tabelheaders (type), óók uit de database moeten komen, omdat deze kunnen veranderen afhankelijk van de date-range die je wilt zien.
Uiteindelijk wil ik dus zo'n tabel als output hebben:
Daarom heb ik nu een aantal verschillende queries en while() loops.
- query + while loop om de type als <th> weer te geven
- query + while loop om de agents als <td> weer te geven
- vervolgens binnen de while loop van de agents wederom een query + while loop om de types te krijgen om vervolgens
- een query te doen om de count per agent per type te krijgen.
En bij dat laatste gaat het fout. Omdat ik voor een maand rapport om en nabij de 220 verschillende agents en 20 verschillende types heb, wordt de laatste query dus 4400 keer gedaan.
Op dit moment duurt de query voor alleen vandaag (41 agents, 7 types) 16 seconden. Een maand overzicht (220 agents, 20 types) duurt 120 seconden, zonder het parsen van de highcharts grafiek.
Volgens mij moet dit toch veel sneller kunnen, alleen weet ik zelf geen opties om dit anders te doen. Wel heb ik geprobeerd om de $listtypesout array te hergebruiken voor de tweede keer dat ie nodig is, alleen kreeg ik dit niet voor elkaar omdat de output steeds 'array' was. Zoeken op dit probleem is lastig, omdat ik een 'table' wil met 'dynamic headers'. Echter in combinatie met MySQL vind ik een hoop dingen waar de tables en headers slaan op MySQL en niet op HTML/PHP.
Ik hoop dat iemand mij kan helpen met de snelheid van deze code te verbeteren. Wellicht denk ik verkeerd en is de code goed, maar ligt het gewoon aan de snelheid van m'n database server?
Alvast bedankt
Echter loop ik nu tegen het probleem aan dat een query erg traag loopt, ik zal hieronder de situatie schetsen en de relevante code plaatsen.
Op dit moment duurt de query voor alleen vandaag (41 agents, 7 types) 16 seconden. Een maand overzicht (220 agents, 20 types) duurt 120 seconden, zonder het parsen van de highcharts grafiek.
Ik heb een MySQL table met daarin data vanuit een web formulier. Relevante velden zijn id, agent, date en type. Een voorbeeld zou zijn:
code:
1
2
3
4
5
6
7
8
9
| id agent date type 1 agent 4 11-08-2014 11:22 type 3 2 agent 3 14-08-2014 11:22 type 5 3 agent 3 13-08-2014 11:22 type 1 4 agent 3 11-08-2014 11:22 type 6 5 agent 5 13-08-2014 11:22 type 4 6 agent 6 12-08-2014 11:22 type 2 7 agent 5 12-08-2014 11:22 type 1 8 agent 6 12-08-2014 11:22 type 2 |
Wat ik wil, is op een pagina een HTML table weergeven met daarin de count per agent, per type. Deze HTML tabel wordt vervolgens gebruikt voor een Hhighcharts grafiek. Het addertje echter is dat de tabelheaders (type), óók uit de database moeten komen, omdat deze kunnen veranderen afhankelijk van de date-range die je wilt zien.
Uiteindelijk wil ik dus zo'n tabel als output hebben:
code:
1
2
3
4
5
6
| agent type2 type3 type5 type6 agent2 0 0 0 1 agent3 0 1 0 0 agent4 0 0 1 0 agent5 0 1 0 1 agent6 1 2 0 0 |
Daarom heb ik nu een aantal verschillende queries en while() loops.
- query + while loop om de type als <th> weer te geven
- query + while loop om de agents als <td> weer te geven
- vervolgens binnen de while loop van de agents wederom een query + while loop om de types te krijgen om vervolgens
- een query te doen om de count per agent per type te krijgen.
En bij dat laatste gaat het fout. Omdat ik voor een maand rapport om en nabij de 220 verschillende agents en 20 verschillende types heb, wordt de laatste query dus 4400 keer gedaan.
Op dit moment duurt de query voor alleen vandaag (41 agents, 7 types) 16 seconden. Een maand overzicht (220 agents, 20 types) duurt 120 seconden, zonder het parsen van de highcharts grafiek.
Volgens mij moet dit toch veel sneller kunnen, alleen weet ik zelf geen opties om dit anders te doen. Wel heb ik geprobeerd om de $listtypesout array te hergebruiken voor de tweede keer dat ie nodig is, alleen kreeg ik dit niet voor elkaar omdat de output steeds 'array' was. Zoeken op dit probleem is lastig, omdat ik een 'table' wil met 'dynamic headers'. Echter in combinatie met MySQL vind ik een hoop dingen waar de tables en headers slaan op MySQL en niet op HTML/PHP.
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
| $listagents_qry = mysqli_query($con,"SELECT agent, count(agent) as count FROM tracker WHERE date >= '$startdate 00:00:00' AND date <= '$enddate 23:59:59' GROUP BY agent ORDER BY count DESC LIMIT 10"); $listtypes_qry = mysqli_query($con,"SELECT type, count(type) as count FROM tracker WHERE date >= '$startdate 00:00:00' AND date <= '$enddate 23:59:59' GROUP BY type ORDER BY count DESC"); echo '<table style="display:none;" id="count_per_agent_tbl">'; echo '<thead>'; echo '<th>Agent</th>'; while($listtypes_out=mysqli_fetch_array($listtypes_qry)){ echo '<th>'.$listtypes_out['type'].'</th>'; } echo '</thead>'; echo '<tbody>'; while($listagents_out=mysqli_fetch_array($listagents_qry)){ $agent = $listagents_out['agent']; echo '<tr>'; echo '<td>'.$agent.'</td>'; $listtypes_qry = mysqli_query($con,"SELECT type, count(type) as count FROM tracker WHERE date >= '$startdate 00:00:00' AND date <= '$enddate 23:59:59' GROUP BY type ORDER BY count DESC"); while($listtypes_out=mysqli_fetch_array($listtypes_qry)){ $type = $listtypes_out['type']; $agent_per_type_out = mysqli_fetch_array(mysqli_query($con,"SELECT count(agent) as count FROM tracker WHERE agent = '$agent' AND type = '$type' AND date >= '$startdate 00:00:00' AND date <= '$enddate 23:59:59'")); echo '<td>'.$agent_per_type_out['count'].'</td>'; } echo '</tr>'; } echo '</tbody>'; echo '</table>'; |
Ik hoop dat iemand mij kan helpen met de snelheid van deze code te verbeteren. Wellicht denk ik verkeerd en is de code goed, maar ligt het gewoon aan de snelheid van m'n database server?
Alvast bedankt
Coding in the cold; <brrrrr />