Voor een export van klantprofielen heb ik een gecombineerde primary key op de tabel: copernica_profiles
PRIMARY KEY is `customer_email` en `id_shop`
De relatie met de tabel: ps_customer ligt op email adres omdat er meerdere klanten voorkomen met hetzelfde email adres.
In de tabel ps_customer voor id_shop = 4 heb ik ongeveer 100.000 records
In de tabel copernica_profiles heb ik ongeveer 80.000 records
Van ongeveer 20.000 records zijn er dus nog geen copernica profielen.
Doormiddel van een LEFT JOIN wil ik dus ook resultaten terugkrijgen van klanten die nog geen profiel hebben.
Het kan echter zijn dat hetzelfde email adres in verschillende shops terugkomt, dus heb ik een conditie op id_shop = 4 in de LEFT JOIN naar de tabel copernica_profiles nodig.
Deze query doet er gemiddeld 5 seconden over:
Deze query doet er gemiddeld 35 ms over:
De laatste query geeft alleen records terug die zowel in ps_customer als in copernica_profiles terugkomen.
Echter wil ik ook records hebben die NIET in copernica_profiles voorkomen.
Gezien de eerste query voor 100 records er 5 seconden over doet, zal het proces voor 100.000 records 5.000 seconden nodig hebben.
Iemand ideeën hoe ik toch relatief snel de gewenste resultaten kan behalen?
PRIMARY KEY is `customer_email` en `id_shop`
De relatie met de tabel: ps_customer ligt op email adres omdat er meerdere klanten voorkomen met hetzelfde email adres.
In de tabel ps_customer voor id_shop = 4 heb ik ongeveer 100.000 records
In de tabel copernica_profiles heb ik ongeveer 80.000 records
Van ongeveer 20.000 records zijn er dus nog geen copernica profielen.
Doormiddel van een LEFT JOIN wil ik dus ook resultaten terugkrijgen van klanten die nog geen profiel hebben.
Het kan echter zijn dat hetzelfde email adres in verschillende shops terugkomt, dus heb ik een conditie op id_shop = 4 in de LEFT JOIN naar de tabel copernica_profiles nodig.
Deze query doet er gemiddeld 5 seconden over:
SQL:
1
2
3
4
5
6
7
8
9
10
11
| SELECT profiles.id_profile, customer.active, customer.email, customer.id_customer FROM `ps_customer` AS customer LEFT JOIN `copernica_profiles` AS profiles ON (profiles.customer_email = customer.email AND profiles.id_shop = 4) WHERE customer.id_customer > 0 AND customer.active = 1 AND customer.id_shop = 4 LIMIT 100 |
Deze query doet er gemiddeld 35 ms over:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
| SELECT profiles.id_profile, customer.active, customer.email, customer.id_customer FROM `ps_customer` AS customer LEFT JOIN `copernica_profiles` AS profiles ON (profiles.customer_email = customer.email) WHERE customer.id_customer > 0 AND customer.active = 1 AND customer.id_shop = 4 AND profiles.id_shop = 4 LIMIT 100 |
De laatste query geeft alleen records terug die zowel in ps_customer als in copernica_profiles terugkomen.
Echter wil ik ook records hebben die NIET in copernica_profiles voorkomen.
Gezien de eerste query voor 100 records er 5 seconden over doet, zal het proces voor 100.000 records 5.000 seconden nodig hebben.
Iemand ideeën hoe ik toch relatief snel de gewenste resultaten kan behalen?