Jag har en tabell som innehåller ipnummer och vilket land dom tillhör och får ut rätt land och landskod med;
SELECT cc AS Country_code, cn AS Country_name
FROM geo_cc
NATURAL JOIN geo_ip
WHERE inet_aton( "200.139.130.244" )
BETWEEN START AND END LIMIT 0 , 30
vilket ger:
Country_code Country_name
BR Brazil
hur skall en korrekt join se ut om jag vill ta ut landet från ytterligare en tabell som har ett fältnamn "server_ip" för att lista tex dom 30 länder som förekommer mest i server_ip? (top 30 länder som besöker en sida i mitt fall)
SELECT cn AS Country_name,count(*) as freq
FROM geo_cc
inner JOIN geo_ip on geo_cc.ci = geo_ip.ci
inner join annantabell
on inet_aton(server_ip) between start AND end
order by freq desc
LIMIT 0 , 30
SELECT cn AS Country_name,count(*) as freq
FROM geo_cc
inner JOIN geo_ip on geo_cc.ci = geo_ip.ci
inner join annantabell
on inet_aton(server_ip) between start AND end
order by freq desc
LIMIT 0 , 30
Den kräver en group by och gruperar jag tex på tex country_name eller geo_cc.ci så tar den väääldigt lång tid. Jag dödade processen efter 40 sekunder.
Jo, jag glömde group by och den skall vara på country_name.
Vad säger explain? Har du index på start/end?
Explain säger:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE geo_cc ALL PRIMARY NULL NULL NULL 232 Using temporary; Using filesort
1 SIMPLE geo_ip ref ci ci 1 usury_usury.geo_cc.ci 315 Using where
1 SIMPLE usury_hits ALL NULL NULL NULL NULL 4604 Using where
Det var inga index, men satte dom nu men är osäker på hur jag bekfräftar att dom är satta.
Men via phpmyadmin får jag fram följande:
Indexes: Documentation
Keyname Type Cardinality Action Field
start INDEX 73158 Edit Drop start
end INDEX 73158 Edit Drop end
ci INDEX 232 Edit Drop ci