Morits Skrevet 20. februar 2009 Del Skrevet 20. februar 2009 (endret) Heisan, jeg har et lite problem med indexering i mysql, håper noen kan hjelpe. CREATE TABLE `fubar` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `user_id` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=FIXED; denne spørringen: EXPLAIN SELECT user_id FROM fubar WHERE user_id IN (1,3) gir følgende resultat: id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE fubar range user_id user_id 4 NULL 197 Using where; Using index mens denne spørringen: EXPLAIN SELECT id, user_id FROM fubar WHERE user_id IN (1,3) gir følgende resultat: id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE fubar ALL user_id NULL NULL NULL 733 Using where Altså, henter jeg ut flere fields enn den med indexen på benytter mysql seg ikke av indexen. Noen som har noen idè på hvorfor, eller hvordan jeg ev kan skrive om spørringen så indexen blir brukt? Endret 22. februar 2009 av Morits Lenke til kommentar
Frank2004 Skrevet 21. februar 2009 Del Skrevet 21. februar 2009 (endret) Altså, henter jeg ut flere fields enn den med indexen på benytter mysql seg ikke av indexen.Noen som har noen idè på hvorfor, eller hvordan jeg ev kan skrive om spørringen så indexen blir brukt? Jeg antar at indeksen brukes i begge tilfeller, men at første spørring henter dataene sine direkte fra index, mens den andre ber om data som må hentes fra radene i tabellen. Hvis det ikke var snakk om mysql hadde ihvertfall det vært en rimelig antagelse.. Endret 21. februar 2009 av Frank2004 Lenke til kommentar
Morits Skrevet 21. februar 2009 Forfatter Del Skrevet 21. februar 2009 Jeg antar at indeksen brukes i begge tilfeller, men at første spørring henter dataene sine direkte fra index, mens den andre ber om data som må hentes fra radene i tabellen. Mulig, men jeg trodde ALL i type feltet betyr at den gjør en full table scan, og i rows viser den at den går igjennom 733 rader (som da er alle radene i denne tabellen), mens i første eksemplet går den kun igjennom 197 rader og type er range Kjører jeg denne spørringen: EXPLAIN SELECT id, user_id FROM fubar WHERE user_id = 3 får jeg dette resultatet: id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE fubar ref user_id user_id 4 const 196 Selv om jeg henter ut data fra flere fields der sier den at type er ref og ikke ALL som i eksempel 2. Og i rows sier den 196 (1 rad mindre enn eksempel 1, da det er kun 1 rad med user_id = 1) istede for 733 rader. Hvis MySQL bruker indexene også i eksempel nr 2, betyr det at EXPLAIN returnerer feil resultat der? eller at jeg ikke leser det riktig? For meg ser det fremdeles ut som om den ikke bruker noen indexer der. Lenke til kommentar
Frank2004 Skrevet 21. februar 2009 Del Skrevet 21. februar 2009 Jeg antar at indeksen brukes i begge tilfeller, men at første spørring henter dataene sine direkte fra index, mens den andre ber om data som må hentes fra radene i tabellen. Mulig, men jeg trodde ALL i type feltet betyr at den gjør en full table scan, og i rows viser den at den går igjennom 733 rader (som da er alle radene i denne tabellen), mens i første eksemplet går den kun igjennom 197 rader og type er range *snip* For meg ser det fremdeles ut som om den ikke bruker noen indexer der. Det er rimelig at indeksene ikke brukes når det bare er snakk om 700 rader, ja. Jeg leste bare det du skrev, gidder ikke se på explain output fra myql. Saken er at med så lite data blir det mindre jobb å lete gjennom tabellene direkte. Lenke til kommentar
Morits Skrevet 22. februar 2009 Forfatter Del Skrevet 22. februar 2009 jepp, var nok derfor. prøvde samme spørringer med flere rader, og da fikk jeg resultatet jeg forventet. takker så mye Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå