15. juni 2007 - 09:30Der er
9 kommentarer og 1 løsning
Brug af index på Group by
Hej
Jeg skal i min database finde de artikler der er blevet mest læst indenfor et givent tidspunkt.
Jeg har en tabel 'hits', hvor hver række representerer et hit. Den har følgende kolonner: hit_id, article_id, hit_date
For at finde de mest læste artikler indenfor et givent tidspunkt, har jeg lavet følgende SQL: SELECT article_id, count( article_id ) FROM hits WHERE hit_date > 1171793600 GROUP BY article_id
Da hits tabellen indeholder 45 mio. rækker, vil jeg meget gerne bruge et index, men mit problem er, at jeg ikke kan få den til at bruge mit index. Jeg har lavet et index på (article_id, hit_date), men det kan den af en eller anden grund ikke finde ud af at bruge, hvis jeg bruger GROUP BY.
Hvordan skal jeg, på den mest optimale måde, finde de artikler, der har fået flest hits inden for en periode?
Den version er sikkert god nok, men det er nok din WHERE på hit_date, der ikke har et index. Det er da nemt at prøve om det hjælper. Ellers kig på http://mysql.com/explain
Hvis du laver indexet om til (hit_date, article_id), burde det gå noget bedre. Grunden er at et index principielt ikke er meget andet end en sorteret liste, og derfor er den jo nødt til at lede det hele igennem, når nu article_id har haft prioritet under sorteringen.
Hvis article_id er med kan den nøjes med at kigge på indexet, fremfor at skulle ned i tabellen bagefter for at tælle op, da den har alle oplysningerne samlet der.
Jeg har nu prøvet at danne et index på hit_date alene, og den bruger den sgu, så det ser ud til at virke.
Jeg kan ikke afprøve det på produktionsdatabasen før i nat, da serveren nok bliver lidt langsom når jeg prøver at danne indexet på min 35 mio rækker :)
Jeg vender frygteligt tilbage hvis det ikke virker :) Men mange tak for hjælpen til jer begge 2.
Nej. Der er ingen sammenhæng mellem tid og artikel i dette tilfælde, der kan bruges til den efterfølgende GROUP BY. Det vil koste (lidt) mere tid at vedligeholde (hit_date, article_id) end (hit_date), og man får ikke noget ud af det.
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.