Avatar billede MrJ Praktikant
15. juni 2007 - 09:30 Der 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?

Mvh
Effer
Avatar billede erikjacobsen Ekspert
15. juni 2007 - 10:15 #1
Har du 2 indexer: eet på article_id og eet på hit_date?
Avatar billede MrJ Praktikant
15. juni 2007 - 10:30 #2
Hej Erik

Nej jeg har følgende indexes:
Primary: hit_id
index: article_id
index: (article_id, hit_date)

Men kan GROUP BY bruges indexes? Har det måske noget med min MYSQL version at gøre? det er 4.1.X så vidt jeg husker
Avatar billede erikjacobsen Ekspert
15. juni 2007 - 10:47 #3
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
Avatar billede pidgeot Nybegynder
15. juni 2007 - 10:55 #4
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.
Avatar billede erikjacobsen Ekspert
15. juni 2007 - 11:03 #5
Der vil næppe være vundet noget med (hit_date, article_id) - bare (hit_date)
Avatar billede pidgeot Nybegynder
15. juni 2007 - 11:11 #6
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.

Om den vil gøre det i praksis, er så en anden sag, men dokumentationen foreskriver at det er muligt i visse tilfælde (http://dev.mysql.com/doc/refman/4.1/en/mysql-indexes.html).
Avatar billede MrJ Praktikant
15. juni 2007 - 11:33 #7
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.

Hvis du lægger et svar Erik får du point
Avatar billede erikjacobsen Ekspert
15. juni 2007 - 11:34 #8
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.
Avatar billede erikjacobsen Ekspert
15. juni 2007 - 11:34 #9
Og jeg samler slet ikke på point, tak. ;)
Avatar billede MrJ Praktikant
15. juni 2007 - 12:04 #10
Ok, men mange tak i hvertfald.
God weekend :)
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