首页 > 解决方案 > 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 > 16777566




SELECT * 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>

标签: mysqlperformancedelay

解决方案


搜索 IP 地址(或任何其他分成桶的指标)效率不高。或者至少使用明显的代码效率不高。您可以获得的最佳平均性能是扫描表格的四分之一以查找您要查找的内容。那是“订单(N)”。

对于大多数操作,您可以获得“Order(1)”性能,但它需要对表和查询进行重组。见http://mysql.rjweb.org/doc.php/ipranges


推荐阅读