Hallo und ein frohes Neues Jahr erst einmal ;-)
Ich habe eine Datenbank für Hunde, in der auch die jeweiligen Züchter / Besitzer erfasst sind.
Die Datenbank hat 26000 Einträge für Hunde und knapp 4000 für Besitzer/Züchter. In der Hunde sind u.a. die Felder breeder_id und owner_id welche dann jeweils die id in der owner tabelle sind.
Nun möchte ich eine Abfrage starten, in der alle aktiven Züchter gelistet sind - dazu benötige ich
a.) alle Züchter (breeder) die in den letzten 8 Jahren einen Wurf hatten (Geburtsdatum des Hundes)
b.) alle Besitzer (owner), die eine Hündin bis zu 8 Jahren mit Zuchtzulassung haben
c.) alle Züchter, die aktuell ein Wurf (geplant) haben
d.) das ganze nach den Ländern sortiert (ist in der Tabelle owner in einer Spalte hinterlegt)
Ich hoffe ihr könnt mir folgen
Meine query dazu ist zu langsam, nur für Deutschland benötigt sie 8 sekunden - also mach ich was falsch ...
SELECT
d.id AS dogid, d.breeder_id, d.date_of_birth, d.gender, d.owner_id, d.breeder_id, d.breeding_approval_since,
h.id AS dogid, h.breeder_id, h.date_of_birth, h.gender, h.owner_id, h.breeder_id, h.breeding_approval_since,
MAX(YEAR(h.date_of_birth)) AS lastlitter,
owner.id, owner.kennelname, owner.country, owner.country_short, owner.kennel_note,
puppy.breeder_id,
MAX(puppy.sollgeboren) AS birthday,
DATE_ADD(MAX(puppy.sollgeboren), INTERVAL 84 DAY) AS database_dateadd,
DATE_SUB(MAX(puppy.sollgeboren), INTERVAL 60 DAY) AS database_datesub,
puppy.active AS showing
FROM owner
LEFT JOIN dog d ON d.owner_id = owner.id
LEFT JOIN dog h ON h.breeder_id = owner.id
LEFT JOIN puppy ON (owner.id = puppy.breeder_id AND puppy.active='1')
WHERE
(
d.date_of_birth >= DATE_SUB(CURDATE(), INTERVAL 8 YEAR)
AND d.breeding_approval_since !='0000'
AND owner.kennelname !=''
AND owner.kennel_note =''
AND owner.country_short='de'
)
or
(
h.date_of_birth >= DATE_SUB(CURDATE(), INTERVAL 8 YEAR)
AND owner.kennelname !=''
AND owner.kennel_note =''
AND h.breeder_id = owner.id
AND owner.country_short='de'
)
GROUP BY country_short, kennelname
ORDER BY kennelname ASC
Index ist keiner drin ....
Tipps, wie ich das ganze besser machen kann?
Ich habe eine Datenbank für Hunde, in der auch die jeweiligen Züchter / Besitzer erfasst sind.
Die Datenbank hat 26000 Einträge für Hunde und knapp 4000 für Besitzer/Züchter. In der Hunde sind u.a. die Felder breeder_id und owner_id welche dann jeweils die id in der owner tabelle sind.
Nun möchte ich eine Abfrage starten, in der alle aktiven Züchter gelistet sind - dazu benötige ich
a.) alle Züchter (breeder) die in den letzten 8 Jahren einen Wurf hatten (Geburtsdatum des Hundes)
b.) alle Besitzer (owner), die eine Hündin bis zu 8 Jahren mit Zuchtzulassung haben
c.) alle Züchter, die aktuell ein Wurf (geplant) haben
d.) das ganze nach den Ländern sortiert (ist in der Tabelle owner in einer Spalte hinterlegt)
Ich hoffe ihr könnt mir folgen
Meine query dazu ist zu langsam, nur für Deutschland benötigt sie 8 sekunden - also mach ich was falsch ...
SELECT
d.id AS dogid, d.breeder_id, d.date_of_birth, d.gender, d.owner_id, d.breeder_id, d.breeding_approval_since,
h.id AS dogid, h.breeder_id, h.date_of_birth, h.gender, h.owner_id, h.breeder_id, h.breeding_approval_since,
MAX(YEAR(h.date_of_birth)) AS lastlitter,
owner.id, owner.kennelname, owner.country, owner.country_short, owner.kennel_note,
puppy.breeder_id,
MAX(puppy.sollgeboren) AS birthday,
DATE_ADD(MAX(puppy.sollgeboren), INTERVAL 84 DAY) AS database_dateadd,
DATE_SUB(MAX(puppy.sollgeboren), INTERVAL 60 DAY) AS database_datesub,
puppy.active AS showing
FROM owner
LEFT JOIN dog d ON d.owner_id = owner.id
LEFT JOIN dog h ON h.breeder_id = owner.id
LEFT JOIN puppy ON (owner.id = puppy.breeder_id AND puppy.active='1')
WHERE
(
d.date_of_birth >= DATE_SUB(CURDATE(), INTERVAL 8 YEAR)
AND d.breeding_approval_since !='0000'
AND owner.kennelname !=''
AND owner.kennel_note =''
AND owner.country_short='de'
)
or
(
h.date_of_birth >= DATE_SUB(CURDATE(), INTERVAL 8 YEAR)
AND owner.kennelname !=''
AND owner.kennel_note =''
AND h.breeder_id = owner.id
AND owner.country_short='de'
)
GROUP BY country_short, kennelname
ORDER BY kennelname ASC
Index ist keiner drin ....
Tipps, wie ich das ganze besser machen kann?