Wordpress wpdb get_results langzaam laden query bij 1000 records
Ik ben bezig om een aparte pagina in mijn Wordpress omgeving aan te maken en daarin wil ik via een aantal queries gegevens ophalen uit mijn MySQL database en deze dan op de pagina tonen. Nu is dat geen probleem maar ik loop met mijn query tegen een probleem aan wanneer die query meer dan 1000 records ophaalt dan duurt dat ongelofelijk lang op de betreffende pagina (dit terwijl als ik de query in phpmyadmin uitvoer deze in 0.000038 seconden klaar is).
Dit is mijn select query die ik heb:
Code (php)
1
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%1' ORDER BY id ASC");
En ik heb dit dan met alle getallen dus ook in LIKE '%2' en LIKE '%3' enz.
Maar op een pagina waar hij met een specifieke datum maar 100 records laat zien per getal gaat alles goed maar ik heb nu een pagina waar hij per getal 1100 records moet laten zien maar dan krijg ik een melding dat de pagina niet geladen kan worden. Als ik dan alle queries wegrem en alleen die van LIKE '%1' over hou dan wordt de pagina na een lange tijd eindelijk geladen met de juiste gegevens. Maar alle queries uitvoeren gaat hem niet worden.
Als ik in de query over een LIMIT 250 set werkt de pagina wel (na lang laden) maar dan mis ik data.
Is er een mogelijkheid om dit probleem op één of andere manier te omzeilen zodat alle records wel geladen worden en snel (niet dat je er 10+ seconden voor hoeft te wachten).
- En zit er op je grote hoeveelheid rijen die je ophaalt ook een paginering?
- En voer je nog meer dingen uit bij het het doorlopen van de records? Als dit nog een querie is, dan kan ik mij indenken waarom het traag loopt.
Omdat er 5 kolommen zijn die ik allemaal laat zien op de pagina.
En zit er op je grote hoeveelheid rijen die je ophaalt ook een paginering?
Nee, het liefst wil ik alle resultaten op één lange pagina tonen.
En voer je nog meer dingen uit bij het het doorlopen van de records?
De onderstaande queries zijn alle queries die ik uitvoer, en na het ophalen laat ik alle kolommen zien via een foreach, meer niet.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%1' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%2' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%3' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%4' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%5' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%6' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%7' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%8' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%9' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%0' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%2' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%3' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%4' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%5' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%6' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%7' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%8' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%9' ORDER BY id ASC");
$wpdb->get_results("SELECT * FROM randomized WHERE datum = '". $datum ."' AND getal LIKE '%0' ORDER BY id ASC");
Of zal het veel meer snelheid schelen als ik een query gebruik waarin ik alles ophaal en dan met een php if then else statement ga werken om de gegevens te tonen?
Ja, onnodige queries in een loop moet je zoveel mogelijk vermijden.
Je kunt dan beter 1 query uitvoeren, waarbij je niet filtert op eindcijfer, maar erop sorteert.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT *, mod(getal, 10) AS eindcijfer
FROM randomized
WHERE datum = '". $datum ."'
ORDER BY
MOD(getal, 10) ASC,
id ASC
FROM randomized
WHERE datum = '". $datum ."'
ORDER BY
MOD(getal, 10) ASC,
id ASC
Dat voert maar 1x een query uit.
NB: als je eindcijfer 0 per se op de laatste plek wilt hebben, dan kun je mod(getal-1, 10) gebruiken.
Je kunt dan zelf in PHP bijhouden of het eindcijfer anders is dan de vorige regel die je weergaf.
Al is het nu nog de vraag of de vertraging uit het aantal query's zelf komt, of door de overhead van Wordpress.
--edit: ik had and getal like .. nog in de query laten staan.
Ik ga er wel vanuit dat "getal" ook werkelijk een numeriek getal bevat.
MOD(x, 10) zal x delen door 10, bijvoorbeel 136 / 10 en dan de rest terug geven. In dit geval 6.
Gewijzigd op 26/10/2021 16:38:30 door Ivo P
Het enige dat de bottleneck kan zijn is I/O, als elke regel bijvoorbeeld vele megabytes aan informatie bevat. Anders is gewoon dat templating-gebeuren in Wordpress aan verbetering toe.
Maar met 1 query scheelt dat in elk geval 9 x de route van de query naar de omgeving waar WP de query uitvoert en de resultset weer tot een array oid. verbouwt.
Ad Fundum op 26/10/2021 15:15:25:
Waarom dan de focus op de query?
Omdat het daar in eerste instantie al niet goed gaat. Lijkt me dus een logische verbetering.