langsame Abfrage mit JOIN in MySQL

S

StephanSch

Aktives Mitglied
Thread Starter
Dabei seit
24.07.2006
Beiträge
406
Reaktionspunkte
1
Ich habe eine master-tabelle und mehrere andere tabellen, die durch die master tabelle verknüpft werden, des weiteren wende ich bei jeder Abfrage auch einen "count" der Ergebnisse an. Das Problem dabei ist, dass die Abfrage sehr langsam ist...ca 6 Sekunden. Habt ihr eine Idee, wie ich die Abfrage optimieren kann?

Abfrage:
Code:
$abfrage = mysql_query("SELECT
Autor_Name,
Autor_Vorname,
Titel,
Pathway,
Semester
					
FROM 
	master_library
INNER JOIN
	meta_person ON master_library.meta_person = meta_person.Ref_ID
INNER JOIN
	meta_projekt ON master_library.meta_projekt = meta_projekt.Ref_ID
WHERE
	 Art_Der_Arbeit = 'Diplom'
ORDER BY 
	Projektnummer DESC
LIMIT
	".mysql_real_escape_string($start).", ".$length."
");

Count:
Code:
$abfrageCount = mysql_query("
SELECT COUNT(*)
FROM 
	master_library
INNER JOIN
	meta_person ON master_library.meta_person = meta_person.Ref_ID
INNER JOIN
	meta_projekt ON master_library.meta_projekt = meta_projekt.Ref_ID
WHERE
	Art_Der_Arbeit = 'Diplom'
");
		
$row = mysql_fetch_array($abfrageCount);
$countRows = $row["0"];

Ich bin für jede Idee oder Hilfe dankbar! Die SQL-Abfrage wird später natürlich noch komplexer werden und mit Suchparametern arbeiten...daher sollte die Abfrage unbedingt schneller ablaufen!
 
Sind die IDs der Tabellen als Primärschlüssel angelegt?

Bei größeren Tabellen ist es vielleicht auch noch sinnvoll, andere Felder, die auch oft für Suchanfragen genutzt werden, mit einem Index zu versehen.

Ich habe hier Tabellen mit ~500.000 Einträgen und da bei Abfragen mit 3 Joins deutlich kürzere (<0.1s) Zeiten.
 
Die einzigste ID, die als Primärschlüssel angelegt ist, ist in der master_library.
In den anderen Tabellen gibt es eine ID (Primärschlüssel) und Ref_ID, die Ref_ID kann theoretisch auch öfters vorkommen und wurde daher nicht als Primärschlüssen angelegt...die master_library vergleicht allerdings deren ID mit der Ref_ID aus den anderen Tabellen.

Ich habe gerade der Ref_ID einen Index geben und nun läuft es verdammt schnell, cool danke! Könntest du vielleicht noch erklären, was der Index in der SQL genau bewirkt?
 
Zuletzt bearbeitet:
Hallo, also Indizes sind bei einer Datenbank natürlich sehr wichtig, wenn es um Performance auf großen Tabellen geht.

Oder hast du mal ein Stichwort in einem Buch ohne entsprechendes Stichwortregister gesucht? :D

Wenn du einen Datensatz mit einer bestimmten ID suchst (und das macht ein Join im Prinzip auch), dann gibt es zwei Möglichkeiten:

1. Du schaust dir jeden Datensatz an und prüfst ob die ID passt. Das kann bei vielen Datensätzen 'ne Weile dauern. :D

2. Du schaust in einen Index, in dem steht in welcher Zeile der Wert der gesuchten ID vorkommt.

Gruß
Dirk
 
  • Gefällt mir
Reaktionen: StephanSch
die Ref_Ids muessen/sollten natuerlich einen index haben. primaer muss nicht sein, das kann die laufende nummer sein. es ist natuelrich kein problem, wenn im index (sofern nicht unique) werte mehrfach vorkommen. also wichtig: alles was irgendwie mit "suche" und "filter" zu tun hat, muss auch einen index haben.
ansonsten kannst du per phpMyAdmin (oder direkt im mysql clienten) mal ein EXPLAIN vor das select setzen und dir die ausgabe ansehen. suche mal im mysql-handbuc nach EXPLAIN.

ein join ueber mehrere tabellen kann ploetzlich "explodieren" und er muss tausende von zeilen anfassen, um zu schauen obs passt. wenn man keinen index verwendet und "joined", dann hat man bei zwei tabellen mit je 100 zeilen schon mal eine treffermenge von 100x100, die im schlechtesten fall geprueft werden muss
 
  • Gefällt mir
Reaktionen: StephanSch
Zurück
Oben Unten