Gå til innhold

Anbefalte innlegg

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 av Morits
Lenke til kommentar
Videoannonse
Annonse
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 av Frank2004
Lenke til kommentar
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
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...