【发布时间】:2021-07-07 12:04:39
【问题描述】:
我在 MySQL 中有一个这样的表:
| startIp | endIp | city | countryCode | latitude | longitude |
|---|---|---|---|---|---|
| 16777216 | 16777471 | Los Angeles | US | 34.0522 | -118.244 |
| 16777472 | 16778239 | Fuzhou | CN | 26.0614 | 119.306 |
| 16778240 | 16779263 | Melbourne | AU | -37.814 | 144.963 |
还有 270 万个条目。
现在我有一个转换后的 IP 地址,例如 16777566。
这应该返回“福州,CN,26.0614, 119.306”
现在我使用这个查询:
SELECT * FROM kombiniert WHERE startIp < 16777566 AND endIp > 16777566
它工作得很好,但速度很慢。
性能:
无限制:SELECT * FROM
平均(2300 毫秒)
kombiniert WHERE startIp < 2264918979 AND endIp > 2264918979;
有限制:SELECT * FROM
平均(1500 毫秒)
kombiniert WHERE startIp < 2264918979 AND endIp > 2264918979 LIMIT 1;
无限制索引:SELECT * FROM
平均(5300 毫秒)
kombiniert WHERE startIp < 2264918979 AND endIp > 2264918979;
索引限制:SELECT * FROM
平均(5500 毫秒)kombiniert WHERE startIp < 2264918979 AND endIp > 2264918979 LIMIT 1;
现在我想加快这个查询!我为什么要这样做?
非常感谢!
编辑:我忘了提:字段 startIp、endIp 是 bigint!
EDIT2:建表sql:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
CREATE TABLE `kombiniert` (<br>
`id` int(11) NOT NULL,<br>
`startIp` bigint(20) NOT NULL,<br>
`endIp` bigint(20) NOT NULL,<br>
`city` text NOT NULL,<br>
`countryCode` varchar(4) NOT NULL,<br>
`latitude` float NOT NULL,<br>
`longitude` float NOT NULL<br>
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;<br>
<br>
ALTER TABLE `kombiniert`<br>
ADD PRIMARY KEY (`id`),<br>
ADD KEY `startIp` (`startIp`),<br>
ADD KEY `endIp` (`endIp`);<br>
<br>
ALTER TABLE `kombiniert`<br>
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2747683;<br>
COMMIT;<br>
【问题讨论】:
-
Indexed without LIMIT 什么索引?提供表结构作为完整的 CREATE TABLE 脚本。 PS。为什么要严格不等式?
-
请同时发布查询计划。
标签: mysql performance delay