Hoi,
Ik wil mijn website voor me laten bepalen wat er in een nieuwsbrief moet komen.
De criteria zijn hiervoor:
Het artikel moet recenter zijn dan 'datum'
Het artikel mag niet eerder in een nieuwsbrief gemailed zijn.
Het artikel mag niet op 'niet mailen' lijst staan
De producent of coproducent moeten op een lijst staan waarop de bezoeker kan filteren wat er gemailed moet worden.
Dit zijn 4 filters die ik over een artikelenlijst van ~8000 records wil gooien, de queries:
Deze laatste query loopt alleen wat langzaam, hoe kan ik deze versnellen? Met left joins en condities als where np.pid is null etc loopt de query ruim 3,5 seconde. De optimale oplossing zou de minus operator zijn, echter wordt deze niet ondersteund in mysql.
Wat zou optimaal zijn?
Vier afzonderlijke queries uitvoeren en binnen php deze van elkaar scheiden?
Maar dat lijkt me wat inefficient, hoe zou dit beter kunnen?
Ik wil mijn website voor me laten bepalen wat er in een nieuwsbrief moet komen.
De criteria zijn hiervoor:
Het artikel moet recenter zijn dan 'datum'
Het artikel mag niet eerder in een nieuwsbrief gemailed zijn.
Het artikel mag niet op 'niet mailen' lijst staan
De producent of coproducent moeten op een lijst staan waarop de bezoeker kan filteren wat er gemailed moet worden.
Dit zijn 4 filters die ik over een artikelenlijst van ~8000 records wil gooien, de queries:
Code:
Query aantal resultaten benodigde tijd
select products_id from products where products_date_added > (SELECT date from lijst where id = '$nieuwsbrief') 2672 0.0020
SELECT date from lijst where id = '$nieuwsbrief' 1 0.0006
select man_id from manufacturers_mail where lijst = '$nieuwsbrief' 218 0.0027
select pid from products_ignore where lijst in ('0', '$nieuwsbrief') 913 0.0005
select distinct np.pid from newsletters_pid np left join newsletters n on (n.id = np.id) where n.lijst = '$nieuwsbrief' 1016 0.0004
select products_id from products where products_date_added > (
SELECT date from lijst where id = '$nieuwsbrief'
) and (producent in (
select man_id from manufacturers_mail where lijst = '$nieuwsbrief'
) or coprodcent in (
select man_id from manufacturers_mail where lijst = '$nieuwsbrief'
)) and products_id not in (
select pid from products_ignore where lijst in ('0', '$nieuwsbrief')
) and products_id not in (
select distinct np.pid from newsletters_pid np left join newsletters n on (n.id = np.id) where n.lijst = '$nieuwsbrief'
) 82 1.2238
Wat zou optimaal zijn?
Vier afzonderlijke queries uitvoeren en binnen php deze van elkaar scheiden?
Code:
$negeer --> select pid from products_ignore where lijst in ('0', '$nieuwsbrief')
$negeer --> select distinct np.pid from newsletters_pid np left join newsletters n on (n.id = np.id) where n.lijst = '$nieuwsbrief'
$moet --> select man_id from manufacturers_mail where lijst = '$nieuwsbrief'
while($totaal --> select products_id, producent, coproducent from products where products_date_added > (SELECT date from lijst where id = '$nieuwsbrief')){
if($totaal['products_id'] !in_array($negeer) && ($totaal['productent'] in_array($moet) || $totaal['coproducent'] in array($moet)) {
$mailen[] = $totaal['products_id'];
}
}