Avatar billede pitzen Nybegynder
12. november 2008 - 08:37 Der er 11 kommentarer og
1 løsning

Deler brugere ip med andre?

Hej experterne..

Jeg skal lave en lille query, som undersøger om en given bruger deler ip med andre brugere.

Dvs. jeg skal kigge i login_log'en og tjekke hvilke af samtlige ip adresser - som brugeren har logget ind fra - der er benyttet af andre brugere.

Jeg er selv noget frem til følgende:

SELECT COUNT(distinct bruger_id) as count, ip FROM login_log WHERE ip in (SELECT ip FROM login_log WHERE bruger_id='1') GROUP BY ip HAVING count>1

Problemet med overstående er, at den åbenbart tager så lang tid at udføre, så min db fryser i 10 minutter.

login_log tabellen består af: id, bruger_id, ip, time

Håber i kan hjælpe :)

Mvh

P
Avatar billede erikjacobsen Ekspert
12. november 2008 - 09:00 #1
Hvor mange rækker? Hvad har du index på?

Men kan den ikke bare laves:

SELECT COUNT(distinct bruger_id) as count, ip
FROM login_log
WHERE bruger_id='1'
GROUP BY ip
HAVING count>1
Avatar billede fennec Nybegynder
12. november 2008 - 09:29 #2
Du har sikkert også gemt IP som tekst. Du burde kunne hente et performance boost ved at ændre adressen til IP-nummer. Det er det man f.eks gør i IP2country databaser:

IP Address = w.x.y.z
IP Number = 16777216*w + 65536*x + 256*y + z

Funktioner til konvertering (php og asp) findes her:
http://www.ip2country.net/ip2country/ip_country_faq.html

Derved arbejder databasen med et tal felt i stedet for et tekst felt.
Avatar billede fennec Nybegynder
12. november 2008 - 09:38 #3
... Bagsiden er selvfølgelig at du skal have opdateret alle dine eksisterende rækker, så det kommer nok til at tage lidt tid.

Jeg vil foreslå at du laver en ny kolonne som hedder IPNummer. Derefter burde der kunne laves en SP, som kan opdatere denne kolonne på baggrund af IP kolonnen. Derved bibeholder du den rigtige IP (som kan forståes) og det ny IP nummer.
Avatar billede pitzen Nybegynder
12. november 2008 - 09:41 #4
Lige nu har jeg 15.000 rækker og intet index..

Hva burde jeg indexere efter? time?


Jeg vil prøve din løsning og desuden kigge nærmere på ip2country :)
Avatar billede pitzen Nybegynder
12. november 2008 - 09:43 #5
Erik..

Din løsning virker vist ikke. Jeg får jo kun resultater der har bruger_id=1, og pointen er jo at sammenligne med alle andre brugere.
Avatar billede erikjacobsen Ekspert
12. november 2008 - 09:48 #6
Det er rigtigt. Du kunne jo have et index på det du søger på: ip og bruger_id. Men hvorfor beskæftiger du dig med databaser, når du ikke engang ved det?
Avatar billede olebole Juniormester
12. november 2008 - 09:49 #7
<ole>

For en databaseprogrammør er indeksering cirka, hvad arm- og benbevægelser er for en svømmer  =)

Du skal indeksere alt, hvad du søger på, men du bør helt klart læse noget om indeksering, for det er vigtigt, det bliver gjort korrekt

/mvh
</bole>
Avatar billede pitzen Nybegynder
12. november 2008 - 09:51 #8
Blev du sur over din løsning ikke var korrekt eller hvorfor fik du lige et surt opstød, mus?

Man skal starte et sted..
Avatar billede pitzen Nybegynder
12. november 2008 - 09:52 #9
Tak ole
Avatar billede schwarz84 Nybegynder
12. november 2008 - 10:07 #10
Du kan prøve at skrive EXPLAIN før din query. Så får du en udskrift, hvor du kan se hvilket index der bruges (eller kan bruges). Prøv at gøre det og skriv resultatet her.

Generelt bør man også undgå subqueries i MySQL hvis man kan erstatte dem med en join. Det giver hurtigere udtræk.
Avatar billede erikjacobsen Ekspert
12. november 2008 - 11:00 #11
En lille optimering, ud over indexer, kunne være: ...(SELECT DISTINCT ip FROM login_log WHERE bruger_id='1') ...
Avatar billede pitzen Nybegynder
08. september 2010 - 10:31 #12
luk
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