MySQL: Join und Group By kein Index möglich
Jonas
- datenbank
Hallo,
ich habe folgendes SQL Statement:
SELECT
count(*) count,a.plz,a.sortort,b.lk_name,b.bland,c.city
FROM adressen a,plz b,kfz_lk c,adressen_kategorien d
WHERE a.plz='69412' AND b.plz=a.plz AND c.ortname=b.lk_name AND d.kategorie_id='1' AND d.eintrag_id=a.id GROUP BY lk_name
EXPLAIN sieht wie folgt aus:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: b
type: ref
possible_keys: plz
key: plz
key_len: 17
ref: const
rows: 1
Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: c
type: ref
possible_keys: ortname
key: ortname
key_len: 767
ref: adressen.b.lk_name
rows: 1
Extra: Using where
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ref
possible_keys: PRIMARY,id,plz
key: plz
key_len: 17
ref: const
rows: 272
Extra: Using where
*************************** 4. row ***************************
id: 1
select_type: SIMPLE
table: d
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: adressen.a.id,const
rows: 1
Extra: Using where; Using index
4 rows in set (0.06 sec)
Wie man sieht behilft sich MySQL row 1 leider mit Using temporary und Using filesort, was natürlich unperformant ist.
Lasse ich aber das Group By weg (dazu muss auch leider das count(*) weg) wird keine tempdatei und kein filesort verwendet:
mysql> EXPLAIN SELECT a.plz,a.sortort,b.lk_name,b.bland,c.city FROM adressen a,p
lz b,kfz_lk c,adressen_kategorien d WHERE a.plz='69412' AND b.plz=a.plz AND c.ortn
ame=b.lk_name AND d.kategorie_id='1' AND d.eintrag_id=a.id\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: b
type: ref
possible_keys: plz
key: plz
key_len: 17
ref: const
rows: 1
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: c
type: ref
possible_keys: ortname
key: ortname
key_len: 767
ref: adressen.b.lk_name
rows: 1
Extra: Using where
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ref
possible_keys: PRIMARY,id,plz
key: plz
key_len: 17
ref: const
rows: 272
Extra: Using where
*************************** 4. row ***************************
id: 1
select_type: SIMPLE
table: d
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: adressen.a.id,const
rows: 1
Extra: Using where; Using index
4 rows in set (0.06 sec)
Folglich ist wohl der Group By Parameter, der ja durch das count(*) nötig wird, die Bremse.
Weiß jdm. eine Möglichkeit diesen umzugestalten?