Avatar billede mora Nybegynder
01. april 2005 - 16:01 Der er 7 kommentarer og
1 løsning

INDEX hastighed spørgsmål

Har lavet et index på kolonne section.
Hele tabellen indeholder 859900 rækker

mysql> SELECT DISTINCT(section) FROM products IGNORE INDEX(sections) ORDER BY section ASC;
32 rows in set (6.81 sec)

mysql> SELECT DISTINCT(section) FROM products ORDER BY section ASC;
32 rows in set (1.70 sec)

mysql> EXPLAIN SELECT DISTINCT(section) FROM products ORDER BY section ASC;
table products
type index
possible_keys NULL
key sections
key_len 20
ref NULL
rows 859900
Extra Using index

1 row in set (0.03 sec)


Hvorfor skal mysql alle rækkerne igennem for at finde ud af hvor mange forskellige sektioner der er, når den har et index på den kolonne ?  (Varchar 20chars, som er længden på den største)
Avatar billede bromer Nybegynder
01. april 2005 - 16:07 #1
Fordi du kører DISTINCT på den skulle jeg mene. Det gør at query-tingen skal dem igennem alle sammen. Jeg er dog ikke helt sikker.
Avatar billede mora Nybegynder
01. april 2005 - 16:11 #2
SELECT section FROM products GROUP BY section ORDER BY section ASC;
1.73sec

SELECT section FROM products GROUP BY section;
1.70sec

Order er ikke voldsomt vigtigt da det kun er 30-50resultater der kommer, men uden DISTINCT eller GROUP vil jeg få et resultat per række, det tager jo en evighed at sende til applikationen for at den skal sortere det.
Avatar billede mora Nybegynder
01. april 2005 - 16:12 #3
Ville egentlig gerne ha den bare stoler 100% på indekset, er meget sjældent vi tilføjer noget og insert skulle jo sørge for at opdatere indeks, så de passer.
Avatar billede bromer Nybegynder
01. april 2005 - 16:14 #4
Jamen den stoler også på dit indeks, men MySQLs query engine kan ikke på forhånd vide hvad DISTINCT gør ved kolonnen. Derfor ser den på alle rækkerne.
Avatar billede mora Nybegynder
01. april 2005 - 16:18 #5
Hmm, andre måder end group eller distinct at få en liste over sektionerne så ?
Avatar billede dsj Nybegynder
01. april 2005 - 16:18 #6
Et indeks indeholder ikke ingen informationer om, metadata udover antallet af entries - indekseringer er jo blot en sorteret rækkefølge af værdier. Derfor er den nødt til at løbe alle indeksets værdier igennem, men som du kan se er den hurtigere til at gennemføre en DISTINCT ved brug af indekset, da værdierne ens værdier vil være placeret lige efter hinanden. Indekset gør således, at kun ét indeks-gennemløb er nødvendig.
Avatar billede dsj Nybegynder
01. april 2005 - 16:20 #7
Du kunne normalisere din tabelstruktur ved at oprette en ny tabel, der indeholder id og navn på dine sektioner. 'products'-tabellen skal således i stedet for 'section'-kolonnen indeholde en reference til den nye tabels primærnøgle.
Avatar billede mora Nybegynder
01. april 2005 - 19:10 #8
Tja, det må blive en anden dag.

I sin tid blev det lavet sådan fordi det var usikkert hvilke kategorier der vill komme, hver ny vare kommer med et kategori navn, så hvis det skal splittes skal programmel tjekke hvad id en sektion har og hvis den ikke findes oprette det, så 1-2 ekstra updates/tilføjninger per vare.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester