mysql - MySQL比较查询性能
问题描述
我在 MySQL 中有一个这样的表:
启动IP | 结束IP | 城市 | 国家代码 | 纬度 | 经度 |
---|---|---|---|---|---|
16777216 | 16777471 | 洛杉矶 | 我们 | 34.0522 | -118.244 |
16777472 | 16778239 | 福州 | 中国 | 26.0614 | 119.306 |
16778240 | 16779263 | 墨尔本 | 非盟 | -37.814 | 144.963 |
还有 270 万个条目。
现在我有一个转换后的 IP 地址,例如 16777566。
这应该返回“福州,CN,26.0614, 119.306”
现在我使用这个查询:
它工作得很好,但速度很慢。性能:无限制
:
平均(2300 毫秒)
有限制:
平均(1500 毫秒) 无限制
索引:
平均(5300 毫秒)
有限制索引:
平均(5500 毫秒)SELECT * FROM
kombiniert
WHERE startIp < 16777566 AND endIp > 16777566SELECT * FROM
kombiniert
WHERE startIp < 2264918979 AND endIp > 2264918979;SELECT * FROM
kombiniert
WHERE startIp < 2264918979 AND endIp > 2264918979 LIMIT 1;SELECT * FROM
kombiniert
WHERE startIp < 2264918979 AND endIp > 2264918979;SELECT * FROM
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>
解决方案
搜索 IP 地址(或任何其他分成桶的指标)效率不高。或者至少使用明显的代码效率不高。您可以获得的最佳平均性能是扫描表格的四分之一以查找您要查找的内容。那是“订单(N)”。
对于大多数操作,您可以获得“Order(1)”性能,但它需要对表和查询进行重组。见http://mysql.rjweb.org/doc.php/ipranges
推荐阅读
- python - Python 正则表达式 ip
- django - Wagtail 模型翻译不适用于 DEBUG = False
- c# - 从 global.asax.cs 文件中的控制器调用计时器上的函数
- android - Google Play 结算订阅:强制“保留”的新政策:应用 UI 中需要更改哪些内容?
- android - react-native-image-crop-picker 在单击图像后使应用程序崩溃
- linq - 如何使用 linq 查询 C# 获取值
- python - 计算熊猫列条目中给出的间隔的平均值
- bash - Bash printf:使用 Ctrl+U 清除整行
- python-3.x - 尝试使用 pip 为机器人框架安装 AppiumLibrary 时出现语法错误
- android - 清单合并失败:uses-sdk:minSdkVersion 19 不能小于库中声明的版本 22