MySQL: Query met 4200 rijen -> Te traag
Ik gebruik een SQL query waarbij een hele tabel wordt opgevraagd.
Dus gewoon SELECT * FROM map.
Ik krijg zo'n 4200 rijen terug, wat nogal lang duurt.
Die rijen worden dan weergegeven op een webpagina na omzetting in XML.
Is er een manier om ervoor te zorgen dat de rijen die niet gewijzigd zijn te 'cachen' en de andere die wél gewijzigd zijn te updaten?
Groetjes en bedankt
Ik kan me niet indenken dat een simpele SELECT-querie met ruim 4.000 records lang duurt. Zit de traagheid niet in het renderen van de HTML-pagina?
Je hebt gelijk als ik de query in PHPMyAdmin doe duurt het maar een klein secondje.
De gegenereerde XML pagina is wel een megabyte groot en het duurt meer dan 2 seconden om ze te genereren, terwijl ik lokaal werk (127.0.0.1).
Is er een manier om alleen de rijen die geüpdatet zijn te herladen en de rest te 'cachen'?
Maar wat voor script gebruik je voor omzetten van query resutlaat naar xml?
- de structuur en inhoud van je data
- de code die de XML bakt
Enne, een XML bestand van één megabyte? Dat is een hoop tekst. En wellicht een beetje zwaar voor een browser? Dit bestand cachen lijkt een goed idee, zodat deze niet elke keer opnieuw gegenereerd hoeft te worden. Een beter idee is wellicht nog kijken of je de bestandsgrootte (flink) kunt terugdringen.
Ik gebruik Symfony om een XML response te genereren. Dit is mijn controller.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
public function geoxmlAction() {
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository('MapBundle:Map');
$markers = $repository->findAll();
$response = new Response($this->renderView('MapBundle:Default:geoxml.xml.twig', array(
'markers' => $markers)));
$response->headers->set('Content-Type', 'application/xml; charset=utf-8');
$date = new DateTime();
$date->modify('+6000 seconds');
$response->setExpires($date);
return $response;
}
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository('MapBundle:Map');
$markers = $repository->findAll();
$response = new Response($this->renderView('MapBundle:Default:geoxml.xml.twig', array(
'markers' => $markers)));
$response->headers->set('Content-Type', 'application/xml; charset=utf-8');
$date = new DateTime();
$date->modify('+6000 seconds');
$response->setExpires($date);
return $response;
}
Dat geeft een XML bestand zoals dit:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<ms>
<m id="1" owner="Laurens" lat="45" lng="-111" faction="f"/>
<m id="2" owner="Lorenzo" lat="47" lng="-121" faction="e"/>
<m id="4" owner="local tribes" lat="83" lng="-85" faction="u"/>
<m id="5" owner="local tribes" lat="83" lng="-83" faction="u"/>
</ms>
<m id="1" owner="Laurens" lat="45" lng="-111" faction="f"/>
<m id="2" owner="Lorenzo" lat="47" lng="-121" faction="e"/>
<m id="4" owner="local tribes" lat="83" lng="-85" faction="u"/>
<m id="5" owner="local tribes" lat="83" lng="-83" faction="u"/>
</ms>
Maar dan 4200 lijnen.
Het twig bestand ziet er zo uit;
Code (php)
1
2
3
4
5
2
3
4
5
<ms>
{% for marker in markers %}
<m id="{{ marker.id }}" owner="{% if marker.owner %}{{ marker.owner }}{%else%}local tribes{%endif%}" lat="{{ marker.lat }}" lng="{{ marker.lng }}" faction="{{ marker.faction }}" />
{% endfor %}
</ms>
{% for marker in markers %}
<m id="{{ marker.id }}" owner="{% if marker.owner %}{{ marker.owner }}{%else%}local tribes{%endif%}" lat="{{ marker.lat }}" lng="{{ marker.lng }}" faction="{{ marker.faction }}" />
{% endfor %}
</ms>
Het probleem is dat ik ten allen tijde een geüpdate versie moet krijgen met alle 4200 rows.
Gewijzigd op 10/04/2016 16:54:34 door Lorre Mertens
Al overwogen om een ander format te gebruiken? Bijvoorbeeld JSON?