# zu langsame mySQL Abfrage



## Paladin (29. Sep 2005)

Hi,

ich habe eine mySQL(4.1) Datenbank auf einem Server und greife mit meinem PC auf diese Datenbank zu. Wenn ich eine bestimmte Query gegen die Datenbank laufen lasse dauert diese extrem lange (mehr als 5min). Die besagte Query berührt zwei Tabellen. Die eine Tabelle hat ca. 90000 ds und die andere ca. 12000. Selbstverständlich ist mir klar, dass 90000 und 12000 ds schon eine ganze menge ist aber es kann eigentlich nicht sein, dass die Abfrage mehr als 5 min dauert. 

So hier nun die schuldige Abfrage:

```
SELECT temp1.AbrArt
FROM temp1 LEFT JOIN EBM_GNR_Neu ON temp1.GNR = EBM_GNR_Neu.GNR
WHERE (((temp1.KVNr)=72) AND ((temp1.UKVNr)=72) AND ((temp1.AG)=80) AND ((temp1.Quartal)=2) AND ((temp1.Jahr)=2005));
```

Die Tabelle temp1 hat ca. 90000 Datensätze und die Tabelle EBM_GNR_Neu hat ca. 12000 Datensätze.

Mache ich bei der Abfrage irgendetwas falsch? Könnte man diese Abfrage vielleicht irgendwie besser schreiben?

Vielen Dank im voraus

Paladin


----------



## AlArenal (29. Sep 2005)

Die ganzen Klammern kannst du dir schenken. Liegen auf den Feldern in der WHERE-Clause auch je ein Index? 

Was sagt EXPLAIN?


----------



## Paladin (29. Sep 2005)

Auch wenn ich die WHERE Klausel weglasse ändert sich die laufzeit nicht (Jedenfalls nicht spürbar).
Was ist EXPLAIN?


----------



## AlArenal (29. Sep 2005)

http://dev.mysql.com/doc/mysql/en/explain.html

Mach einfach 


```
EXPLAIN SELECT temp1.AbrArt
FROM temp1 LEFT JOIN EBM_GNR_Neu ON temp1.GNR = EBM_GNR_Neu.GNR
WHERE temp1.KVNr)=72 AND temp1.UKVNr=72 AND temp1.AG=80 AND temp1.Quartal=2 AND temp1.Jahr=2005
```


----------



## Paladin (29. Sep 2005)

EXPLAIN sagt: (OHNE WHERE Statement)

id  select type     table                  type     possible keys     key          key_len           ref        rows     extra[/b]
1     SIMPLE        temp1                ALL          null               null           null                 null       77790   
1     SIMPLE        EBM_GNR_Neu    ALL          null               null           null                 null       13684


----------



## AlArenal (29. Sep 2005)

Ohne WHERE ist EXPLAIN aber langweilig.. Hau eurem DB-Bauer mal eine drauf, weil er keine Schlüssel vergeben hat... Sobald die drin sind, gehts auch deutlich flotter.


----------



## Paladin (29. Sep 2005)

Vielen Dank AlArenal. 
Ich werd mal versuchen in die Tabellen ein paar Schlüssel mit reinzubringen.


----------



## AlArenal (29. Sep 2005)

Grundsätzlich:

Schlüssel auf alle Felder, über die man JOINs fährt und die man in WHERE- und ORDER BY-Clauses benutzt.


----------



## Bleiglanz (29. Sep 2005)

WHERE (
temp1.KVNr=72 AND 
temp1.UKVNr=72 AND 
temp1.AG=80 AND 
temp1.Quartal=2 AND 
temp1.Jahr=2005); 

betrifft nur die temp1

SELECT temp1.AbrArt 

betrifft auch nur die temp1

WOZU der left-JOIN


----------

