我有一张拥有大约1300万行的表,并且我的主键是十六进制值VARBINARY(16)
。MySQL/MariaDB按分数排序排列
我用的是后续查询来获取我的结果:
SELECT *
FROM dbip
WHERE ip_start <= INET6_ATON('XXX.XX.XX.XX')
AND addr_type = 4
ORDER BY ip_start DESC
LIMIT 1;
但此查询需要大约0.1秒,它应该是约0.02秒或更少。
我的带宽的99%是在巴西谁只是131.270行,我在我的数据库列country
列。那么我可以怎样在巴西的其余地方首先在巴西搜索这个IP呢?你认为这样我会获得一些毫秒?
我的表:
CREATE TABLE `dbip`
(
`addr_type` TINYINT(1) NOT NULL,
`ip_start` VARBINARY(16) NOT NULL,
`ip_end` VARBINARY(16) NOT NULL,
`country` CHAR(2) NOT NULL,
`stateprov` VARCHAR(80) NOT NULL,
`city` VARCHAR(80) NOT NULL,
`latitude` FLOAT NOT NULL,
`longitude` FLOAT NOT NULL,
`timezone_offset` FLOAT NOT NULL,
`timezone_name` VARCHAR(64) NOT NULL,
`isp_name` VARCHAR(128) NOT NULL,
`connection_type` VARCHAR(8) NULL DEFAULT NULL,
`organization_name` VARCHAR(128) NOT NULL,
PRIMARY KEY (`ip_start`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
这是一个实时数据,所以必须要快。我也接受建议改变我的数据库,我尝试了一些与记忆储存空间,但不接受二进制值索引或不我允许使用<=
命令
什么是您的表格架构? – Alex
你是怎么确定你的查询时间应该是“0,02秒或更少”? –
@BobJarvis - 系统最低要求。我需要这样做才能有更好的表现 – Guhh