【发布时间】:2020-10-25 12:23:15
【问题描述】:
我的表中有 geoip 数据,network_start_ip 和 network_end_ip 是 varbinary(16) 列,结果为 INET6_ATON(ip_start/end) 作为值。其他 2 列是纬度和经度。
CREATE TABLE `ipblocks` (
`network_start_ip` varbinary(16) NOT NULL,
`network_last_ip` varbinary(16) NOT NULL,
`latitude` double NOT NULL,
`longitude` double NOT NULL,
KEY `network_start_ip` (`network_start_ip`),
KEY `network_last_ip` (`network_last_ip`),
KEY `idx_range` (`network_start_ip`,`network_last_ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
如您所见,我创建了 3 个用于测试的索引。为什么我的(很简单的)查询
SELECT
latitude, longitude
FROM
ipblocks b
WHERE
INET6_ATON('82.207.219.33') BETWEEN b.network_start_ip AND b.network_last_ip
不使用任何这些索引?
查询需要大约 3 秒,这对于在生产环境中使用来说太长了。
【问题讨论】:
-
InnoDB 表确实需要
PRIMARY KEY。
标签: mysql sql indexing mariadb