01. april 2005 - 16:01Der 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)
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.
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.
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.
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.
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.
Synes godt om
Ny brugerNybegynder
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.