nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

GROUP BY zu langsam

Von: Günter Baier (guenter.baier@googlemail.com) [Profil]
Datum: 12.06.2008 02:29
Message-ID: <g2pqk1$h3c$1@online.de>
Newsgroup: de.comp.datenbanken.mysql
Hallo,

ich habe einen Query mit vielen LEFT JOINTS.
Natürlich verwende ich dafür ein GROUP BY, um die
Results in eindeutige Gruppen zu sortieren.

Allerdings dauert das GROUP BY fast 2 Sekunden,
wenn ich den Query ohne GROUP BY durchlaufen lasse,
so bekomme ich das Ergebnis (zwar mit uneindeutigen IDs)
in 0,02 Sekunden zurück.

Zumindest für das Ermitteln der möglichen Gesamtergebnisse
zum durchblättern der Ergebnisse macht hier der Query ohne
GROUP BY geschwindigkeitstechnisch mehr Sinn, weil ich dann
mit PHP per array_unique mir die doppelten IDs selber entfernen kann.

Aber sauber ist das so nicht und für die Teilmengen Abfrage mit LIMIT
benötige ich auf jeden Fall das GROUP BY.


Hat jemand einen Tipp dazu?


Danke

Günter


EXPLAIN der QUERY:

http://www.kommandsee.de/explain.gif


Die bremsenden Tabellen in der Abfrage sind m.E. nach:

event_job
event_partic

mit jeweils ca 11.000 Einträgen

Aufbau wie folgt:

CREATE TABLE `event_job` (
`ID` int(10) NOT NULL auto_increment,
`id_event` int(10) NOT NULL default '0',
`id_person_int` int(10) NOT NULL default '0',
`id_job` int(10) NOT NULL default '0',
`create_datetime` datetime NOT NULL default '0000-00-00 00:00:00',
`deleted` int(1) NOT NULL default '0',
PRIMARY KEY  (`ID`),
KEY `id_event` (`id_event`,`id_person_int`,`id_job`),
KEY `idJob` (`id_job`),
KEY `idPerson` (`id_person_int`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
AUTO_INCREMENT079;





QUERY siehe hier:


SELECT event.ID AS eventID, event.event_name, event.event_date,
city.city_name, inst_intern.inst_name
FROM event
LEFT JOIN inst_intern ON (inst_intern.ID = event.id_inst)
LEFT JOIN inst_intern t1 ON (t1.ID = event.id_query_inst)
LEFT JOIN inst_loc ON (inst_loc.ID = event.id_inst_loc)
LEFT JOIN city ON (city.ID = inst_intern.id_city)
LEFT JOIN city t2 ON (t2.ID = inst_loc.id_city)
LEFT JOIN province ON (province.ID = city.id_province)
LEFT JOIN country ON (country.ID = city.id_country)
LEFT JOIN event_clas_sub ON (event_clas_sub.ID = event.id_event_clas_sub)
LEFT JOIN event_clas ON (event_clas.ID = event_clas_sub.id_event_clas)
LEFT JOIN event_job ON (event_job.id_event = event.ID)
LEFT JOIN event_partic ON (event_partic.id_event = event.ID)
LEFT JOIN person_intern ON (person_intern.ID = event_job.id_person_int)
LEFT JOIN person_intern t3 ON (t3.ID = event_partic.id_person_int)
LEFT JOIN job ON (job.ID = event_job.id_job AND event_job.id_event
event.ID AND event_job.id_person_int = person_intern.ID)
LEFT JOIN partic ON (partic.ID = event_partic.id_partic AND
event_partic.id_event = event.ID AND event_partic.id_person_int
person_intern.ID)

WHERE
event.event_name LIKE '%berlin%' OR
event.event_desc LIKE 'berlin%' OR
inst_intern.inst_name LIKE '%berlin%' OR
t1.inst_name LIKE '%berlin%' OR
inst_loc.inst_loc_name LIKE '%berlin%' OR
city.city_name LIKE '%berlin%' OR
t2.city_name LIKE '%berlin%' OR
province.province LIKE '%berlin%' OR
country.country LIKE '%berlin%' OR
event_clas_sub.event_clas_sub LIKE '%berlin%' OR
event_clas.event_clas LIKE '%berlin%' OR
job.job_name LIKE '%berlin%' OR
partic.partic LIKE '%berlin%' OR
person_intern.person_ln LIKE '%berlin%' OR p
erson_intern.person_fn LIKE '%berlin%' OR
t3.person_ln LIKE '%berlin%' OR
t3.person_fn LIKE '%berlin%'

GROUP BY event.ID
ORDER BY event.event_date DESC LIMIT 0,10

[ Auf dieses Posting antworten ]

Antworten