2010-10-24 7 views
5

Ho due tabelle: una è ip_group_city da ipinfodb.com contenente numeri ip_start per determinare la posizione degli IP, e altro è "visite" con informazioni sul visitatore del sito Web contenente la colonna "ip".IP efficace -> query di posizione

Devo selezionare la top 10 region_code (da ip_group_city) controllando region_code per ogni IP dalla tabella "visits".

In questo momento mi sto caricando tutti gli IP da "visite" in un array e utilizzare queste informazioni IP di interrogare l'ip_group_city da:

SELECT region_code 
FROM ip_group_city 
WHERE ip_start <= INET_ATON(IP_FROM_ARR) 
ORDER BY ip_start DESC LIMIT 1 

Sono in grado di creare una sorta di interrogazione annidata fare il lavoro per me, perché in questo momento le cose sono un po 'lente :) - ci vogliono fino a 30s sul mio laptop xampp (AMD Turion x2 2GHz, con Windows 7 ultima versione a 64 bit)

Ecco la tabella con gli indirizzi IP (visite)

CREATE TABLE IF NOT EXISTS `visits` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`clientid` mediumint(8) unsigned NOT NULL, 
`ip` varchar(15) NOT NULL, 
`url` varchar(512) NOT NULL, 
`client_version` varchar(64) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=49272 ; 

Grazie

+0

Inoltre, Consigli su altri modi intorno sono accettate. Forse c'è qualche altro db che è più efficace per questo re del lavoro. Ho più di 10.000 di IP nel db che devo risolvere per la geolocalizzazione. – hummingBird

+0

Non riesco a riprodurre il problema. Usando 'ipinfodb_one_table_small' con MySQL 5.1, la tua query termina in meno di 10ms per me (su Linux). Presumo che gli anni '30 siano per fare più query, ad es. per tutte le visite. Se è così, si prega di mostrare anche la tabella delle visite e il modo in cui ci si ricollega. –

+0

ok, sto aggiungendo la struttura della tabella alla domanda :) – hummingBird

risposta

2

Dal momento che hai detto altre soluzioni vengono accolti ...

Si potrebbe voler controllare MaxMind. Hanno buone ricerche per paese e città tramite IP. Puoi installare un plug-in Apache o PHP per renderlo veloce - non devi nemmeno gestire il database da solo.

+0

grazie, vado con questo. – hummingBird

2

Per indicizzare il tuo tavolo:

ALTER TABLE `ip_group_city` ADD INDEX (`ip_start`) 

per ottenere i primi 10 region_codes:

SELECT igc.region_code 
FROM ip_group_city igc 
JOIN visits v ON igc.ip_start = v.ip 
GROUP BY igc.region_code 
ORDER BY COUNT(*) DESC 
LIMIT 10 
+0

sfortunatamente, v.ip è una stringa che rappresenta l'indirizzo ip, mentre ip_start è un numero calcolato dalla funzione inet_aton dall'indirizzo ip. , nel db ci sono "solo" indirizzi da 1,5 milioni e quegli indirizzi coprono sostanzialmente tutti i possibili IP, il tuo join non funzionerebbe – hummingBird

0
ALTER TABLE `ip_group_city` ADD INDEX (`ip_start`) 

questo è tutto quello che sto dicendo. assicurarsi di utilizzare btree e non hash: D

Problemi correlati