如何通过 IP 地址查询加快国家检测速度?
Posted
技术标签:
【中文标题】如何通过 IP 地址查询加快国家检测速度?【英文标题】:How to speed up country detection from ip adress query? 【发布时间】:2020-01-06 10:44:58 【问题描述】:我正在尝试使用此服务中的地理位置 ip db:
https://lite.ip2location.com/database/ip-country-region-city
我将 csv 文件导入我的 mysql 数据库。现在我的表有 2,716,854 行。我的查询很慢。
我的表sql:
CREATE TABLE `ip2location_db3`(
`ip_from` INT(10) UNSIGNED,
`ip_to` INT(10) UNSIGNED,
`country_code` CHAR(2),
`country_name` VARCHAR(64),
`region_name` VARCHAR(128),
`city_name` VARCHAR(128),
INDEX `idx_ip_from` (`ip_from`),
INDEX `idx_ip_to` (`ip_to`),
INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
我的查询:
SELECT *
FROM `ip2location_db3`
WHERE ip_from <=1598483915
AND ip_to >=1598483915
平均查询时间:
1.3627 seconds.
我的桌子是这样的:
如何加快查询速度?
【问题讨论】:
您可以在当前查询上运行EXPLAIN SELECT
吗?我认为您当前的idx_ip_from_to
索引将被使用,并且查询会很快。
imgur.com/V8PAX4M 这是什么意思?
这意味着 MySQL 没有使用任何索引。请问1598483915
的IP值有多普遍?如果它真的很常见,那么索引可能不会加快速度。
我尝试了另一个IP值:2967684740。平均查询时间为0.9秒,仍然很慢
老实说,对于 300 万行来说,一秒钟的时间并不是特别长的恕我直言。
【参考方案1】:
您的表 SQL 应该遵循他们的常见问题解答https://www.ip2location.com/faqs/db3-ip-country-region-city#database
CREATE DATABASE ip2location;
USE ip2location;
CREATE TABLE `ip2location_db3`(
`ip_from` INT(10) UNSIGNED,
`ip_to` INT(10) UNSIGNED,
`country_code` CHAR(2),
`country_name` VARCHAR(64),
`region_name` VARCHAR(128),
`city_name` VARCHAR(128),
PRIMARY KEY (`ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
那么你的查询应该是:
SELECT `ip_from`, `ip_to`, `country_code`, `country_name`, `region_name`, `city_name`
FROM `ip2location_db3`
WHERE INET_ATON([IP ADDRESS]) <= ip_to LIMIT 1
如果你使用上面的方法,你的查询速度应该会提高很多。
【讨论】:
MyISAM 在 2020 年?应该是 InnoDB。 InnoDB 缓存可以大大加快查询速度。这也需要ORDER BY
,否则 MySQL 可以随意选择一条记录。【参考方案2】:
将 SELECT * 替换为 SELECT 并列出您实际需要的字段。 目前您正在返回不需要的字段,例如 ip_from 和 ip_to
【讨论】:
执行SELECT *
效率不高,但不会显着提高性能。这个表很精简,只是需要更好的索引。以上是关于如何通过 IP 地址查询加快国家检测速度?的主要内容,如果未能解决你的问题,请参考以下文章