Tôi gặp một vấn đề tìm kiếm một cách nhanh chóng gia nhập các bảng tìm kiếm như thế:bảng GeoIP tham gia với bảng IP trong MySQL
mysql> explain geo_ip;
+--------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+-------+
| ip_start | varchar(32) | NO | | "" | |
| ip_end | varchar(32) | NO | | "" | |
| ip_num_start | int(64) unsigned | NO | PRI | 0 | |
| ip_num_end | int(64) unsigned | NO | | 0 | |
| country_code | varchar(3) | NO | | "" | |
| country_name | varchar(64) | NO | | "" | |
| ip_poly | geometry | NO | MUL | NULL | |
+--------------+------------------+------+-----+---------+-------+
mysql> explain entity_ip;
+------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------+------+-----+---------+-------+
| entity_id | int(64) unsigned | NO | PRI | NULL | |
| ip_1 | tinyint(3) unsigned | NO | | NULL | |
| ip_2 | tinyint(3) unsigned | NO | | NULL | |
| ip_3 | tinyint(3) unsigned | NO | | NULL | |
| ip_4 | tinyint(3) unsigned | NO | | NULL | |
| ip_num | int(64) unsigned | NO | | 0 | |
| ip_poly | geometry | NO | MUL | NULL | |
+------------+---------------------+------+-----+---------+-------+
Xin lưu ý rằng tôi không quan tâm đến việc tìm kiếm các hàng cần thiết trong geo_ip
bởi chỉ ONE địa chỉ IP cùng một lúc, tôi cần một entity_ip LEFT JOIN geo_ip
(hoặc tương tự/cách tương tự).
Đây là những gì tôi có bây giờ (sử dụng đa giác như tư vấn về http://jcole.us/blog/archives/2007/11/24/on-efficiently-geo-referencing-ips-with-maxmind-geoip-and-mysql-gis/):
mysql> EXPLAIN SELECT li.*, gi.country_code FROM entity_ip AS li
-> LEFT JOIN geo_ip AS gi ON
-> MBRCONTAINS(gi.`ip_poly`, li.`ip_poly`);
+----+-------------+-------+------+---------------+------+---------+------+--------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------+
| 1 | SIMPLE | li | ALL | NULL | NULL | NULL | NULL | 2470 | |
| 1 | SIMPLE | gi | ALL | ip_poly_index | NULL | NULL | NULL | 155183 | |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------+
mysql> SELECT li.*, gi.country_code FROM entity AS li LEFT JOIN geo_ip AS gi ON MBRCONTAINS(gi.`ip_poly`, li.`ip_poly`) limit 0, 20;
20 rows in set (2.22 sec)
Không đa giác
mysql> explain SELECT li.*, gi.country_code FROM entity_ip AS li LEFT JOIN geo_ip AS gi ON li.`ip_num` >= gi.`ip_num_start` AND li.`ip_num` <= gi.`ip_num_end` LIMIT 0,20;
+----+-------------+-------+------+---------------------------+------+---------+------+--------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------------------+------+---------+------+--------+-------+
| 1 | SIMPLE | li | ALL | NULL | NULL | NULL | NULL | 2470 | |
| 1 | SIMPLE | gi | ALL | PRIMARY,geo_ip,geo_ip_end | NULL | NULL | NULL | 155183 | |
+----+-------------+-------+------+---------------------------+------+---------+------+--------+-------+
mysql> SELECT li.*, gi.country_code FROM entity_ip AS li LEFT JOIN geo_ip AS gi ON li.ip_num BETWEEN gi.ip_num_start AND gi.ip_num_end limit 0, 20;
20 rows in set (2.00 sec)
(On số cao hơn hàng trong việc tìm kiếm - không có sự khác biệt)
Hiện tại tôi không thể nhận được bất kỳ hiệu suất nào nhanh hơn từ các truy vấn này như 0,1 giây trên mỗi IP là quá chậm đối với tôi.
Có cách nào để làm cho nó nhanh hơn không?
Chụp trong bóng tối: bất kỳ cơ hội nào mà chỉ mục trên 'ip_num' của' entity_ip' sẽ cải thiện tốc độ của truy vấn thứ hai? –
A phải làm điều đó bên trong MySQL?Nếu chúng ta coi ip_num_start và ip_num_end là các điểm liên quan và đọc entity_ip.ip_num theo cách sắp xếp là x-coord của một đường quét trên các chấm, khái niệm về thuật toán đường quét có thể cho bạn chạy nhanh hơn so với n-by-m left tham gia bên trong MySQL. –
Không biết về trường hợp của tác giả, đối với tôi (và nhiều người) nó sẽ rất thú vị để xem giải pháp mysql duy nhất. – Oroboros102