2010-10-24 33 views
5

Tôi có hai bảng: một là ip_group_city từ ipinfodb.com chứa số ip_start để xác định vị trí của IP và khác là "lượt truy cập" với thông tin về khách truy cập trang web có chứa cột 'ip'.Hiệu quả ip-> truy vấn vị trí

Tôi cần phải chọn 10 vùng_code đầu tiên (từ ip_group_city) bằng cách kiểm tra region_code cho từng IP từ bảng "lượt truy cập".

Ngay bây giờ tôi đang tải tất cả các IP từ "thăm" vào một mảng và sử dụng những thông tin IP để truy vấn ip_group_city bởi:

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

Tôi không thể tạo ra một số loại truy vấn lồng nhau để làm công việc cho tôi, bởi vì hiện tại mọi thứ hơi chậm một chút :) - nó chiếm đến 30s trên máy tính xách tay xampp của tôi (AMD Turion x2 2GHz, chạy windows 7 phiên bản 64bit cuối cùng)

Đây là bảng có địa chỉ IP (lượt truy cập)

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 ; 

Cảm ơn

+0

Ngoài ra, lời khuyên về những cách khác xung quanh được chấp nhận. Có lẽ có một số db khác hiệu quả hơn cho vị vua này. Tôi có nhiều hơn 10.000 IP trong db mà tôi cần phải giải quyết để định vị. – hummingBird

+0

Tôi không thể tái tạo sự cố. Sử dụng 'ipinfodb_one_table_small' với MySQL 5.1, truy vấn của bạn hoàn thành dưới 10ms đối với tôi (trên Linux). Tôi cho rằng những năm 30 là để thực hiện nhiều truy vấn, ví dụ: cho tất cả các lần truy cập. Nếu có, vui lòng hiển thị bảng lượt truy cập và cách bạn lặp lại nó. –

+0

ok, tôi đang thêm cấu trúc bảng vào câu hỏi :) – hummingBird

Trả lời

2

Vì bạn nói giải pháp khác được hoan nghênh ...

Bạn có thể muốn kiểm tra MaxMind. Họ có tra cứu quốc gia và thành phố tốt bằng IP. Bạn có thể cài đặt một plugin Apache hoặc PHP để làm cho nó nhanh - thậm chí không cần phải tự xử lý cơ sở dữ liệu.

+0

cảm ơn bạn, tôi sẽ đi với điều này. – hummingBird

2

Để index bảng của bạn:

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

Để có được 10 region_codes top:

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

không may, v.ip là một chuỗi đại diện cho địa chỉ ip, trong khi ip_start là một số calculater bởi chức năng inet_aton từ địa chỉ ip. , trong db có 'chỉ' 1.5Mil địa chỉ, và những địa chỉ này bao gồm về cơ bản tất cả các ips có thể tham gia của bạn sẽ không hoạt động .. – hummingBird

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

thats all i đang nói. hãy chắc chắn để sử dụng btree và không băm: D

Các vấn đề liên quan