Clanintern Clanintern Clanintern

Forum

Öffentliche Foren
FORUM: Spiele & Computer THEMA: mySQL benutzt Index nicht ?
AUTOR BEITRAG
Ynusis

RANG Deckschrubber

#1 - 19.06 10:24

Wenn ich hab WHERE cat = 1 dann benutzt er den Index wo auf cat gelegt ist.

Mach ich dagegen WHERE cat = 0 dann benutzt er den Index nicht.

An was kann das liegen?
Allanon // alex

CI-Chef

RANG Prophet of Clanintern

#2 - 20.06 14:47

schonmal EXPLAIN befragt?
post mal das EXPLAIN ergebnis und das komplette query
Ynusis

RANG Deckschrubber

#3 - 20.06 15:55

sql:
code:

SELECT
 i.userid, i.item, i.zustand
 FROM items AS i
 LEFT JOIN user AS u ON u.userid = i.userid
 WHERE i.aktion = 0 && i.cat BETWEEN 2 AND 13


Explain:
code:

id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra
1  SIMPLE  g  ALL  aktion,cat  NULL  NULL  NULL  349285  Using where
1  SIMPLE  p  eq_ref  PRIMARY  PRIMARY  4  lala.i.userid  1  Using index
Allanon // alex

CI-Chef

RANG Prophet of Clanintern

#4 - 23.06 15:01

also laut explain wird die items tabelle ohne key aufgerufen.. was klar ist, da du den index ja auf cat hast und nicht auf aktion
deluxe *tautomerisiert*

RANG Master of Clanintern

#5 - 23.06 16:05

Mir drängt sich die Frage auf: is das ein zweispaltiger Index oder sind das 2 Indices?
Ynusis

RANG Deckschrubber

#6 - 25.06 08:13

Im Moment sind es 2 einspaltige. Habe es aber auch schon zweispaltig versucht.

@4: Ich verstehe nicht ganz wieso das klar ist. Ich habe die Spalten, die ich im Where abfrage auch als Indices angelegt. (items.aktion und items.cat haben je ein Index)
Allanon // alex

CI-Chef

RANG Prophet of Clanintern

#7 - 25.06 08:58

ups ich hab die spalten falsch gelesen ...
das ist komisch .. denn der index auf aktion müsste hier schon ziehn..

kann es sein, dass es am && liegt? ich verwende in queries immer AND .. wusste gar nicht dass mysql das logisch && interpretiert



andere frage: warum wird hier auf user gejoined, wenn nicht auf die userid eingeschränkt wird?
Ynusis

RANG Deckschrubber

#8 - 25.06 17:41

ich lese eigentlich noch Daten aus der User Tabelle aus, hab das aber hier weggelassen.

Das mit && zu AND machen bringt nix.

Komisch ist, dass wenn ich z.B. habe:
code:

SELECT
 i.userid, i.item, i.zustand
 FROM items AS i
 LEFT JOIN user AS u ON u.userid = i.userid
 WHERE i.aktion != 1 && i.cat = 13

Dann verwendet er den Index auf cat, mache ich:
code:

SELECT
 i.userid, i.item, i.zustand
 FROM items AS i
 LEFT JOIN user AS u ON u.userid = i.userid
 WHERE i.aktion = 1 && i.cat = 13

verwendet er beide Indices.