Timeout bei Verschachtelung, unmittelbares Ergebnis bei Ausführung nacheinander

timestamp

Mitglied Käsekuchen
Hallo Forum,

ich bin ein wenig verwirrt, folgender Query führt zu ewig langer Ladezeit (49sek) beim Ausführen:
SQL:
SELECT * FROM medien WHERE medien_id IN (SELECT DISTINCT medien_id FROM schlagwörter WHERE kategorie_id = 224)

Folgender Queries funktioniert dagegen unmittelbar:
SQL:
SELECT DISTINCT medien_id FROM schlagwörter WHERE kategorie_id = 224;
SELECT * FROM medien WHERE medien_id IN (0, 752, 783)

Warum ist das so? Wie löse ich das Problem?
 
Das Zweite sind 2 Queries. Sehe ich richtg, 0, 752, 783 sind die Resltate des ersten?

Bei deinem ersten Beispiel scheint er die Verknüpfung komisch zu machen.
Zeig doch mal den Explian-Plan.
Ich würde aus dem auch ein klassisches INNER JOIN machen anstelle eines Subqueries.
Ggf. beim INNER JOIN das Subquery anwenden.

Man findet nur durch Testen heraus obs etwas hilft.

SQL:
SELECT 
	m.* 
FROM 
	medien AS m
	INNER JOIN schlagwörter AS s
		ON s.medien_id = m.medien_id;
WHERE
	s.kategorie_id = 224;

SELECT 
	m.* 
FROM 
	medien AS m
	INNER JOIN (
		SELECT DISTINCT medien_id 
		FROM schlagwörter 
		WHERE kategorie_id = 224
	) AS s
		ON s.medien_id = m.medien_id;
 
Zuletzt bearbeitet von einem Moderator:
Ja, das siehst du richtig, die 3 Zahlen sind der Rückgabewert vom 1. Query.

Das Explain läuft instant durch:
Code:
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	PRIMARY	medien	ALL	NULL	NULL	NULL	NULL	822	Using where
2	DEPENDENT SUBQUERY	schlagwörter	ALL	NULL	NULL	NULL	NULL	11034	Using where; Using temporary

Deine beiden Queries funktionieren umgehend.
1)
Code:
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	s	ALL	NULL	NULL	NULL	NULL	11034	Using where
1	SIMPLE	m	eq_ref	PRIMARY	PRIMARY	4	d015bd59.s.medien_id	1

2)
Code:
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	3	 
1	PRIMARY	m	eq_ref	PRIMARY	PRIMARY	4	s.medien_id	1	 
2	DERIVED	schlagwörter	ALL	NULL	NULL	NULL	NULL	11034	Using where; Using temporary

Mir scheint der 1. Query ist die bessere Wahl?
 
Zurück