我有一張擁有大約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