如何使我的查询选择速度超过200万条记录

时间:2014-06-20 04:29:43

标签: java mysql sql hql mysql-workbench

我需要一个解决方案来解决我的问题。我有一个表,其中包含200万条与地理坐标相关的记录。要从表中获取特定行,查询执行时间将为24秒。在这里,我想要为我的应用方面选择500以上的记录。因此,任何人都建议任何解决方案,以加快我的查询。

查询

SELECT * FROM myProject.MAP where start_ip<=419297593 and end_ip>=419297593;

表格结构

Field,Type,Null,Key,Default,Extra
start_ip,"int(10) unsigned",YES,MUL,NULL,
end_ip,"int(10) unsigned",YES,MUL,NULL,
country_id,int(11),NO,,NULL,
lat,double,YES,,NULL,
lng,double,YES,,NULL,
id,int(11),NO,PRI,NULL,auto_increment

3 个答案:

答案 0 :(得分:3)

您需要在start_ipend_ip列上创建索引。有关语法和不同类型的索引,请查看documentation

CREATE INDEX id_index ON myproject.MAP (start_ip);

如评论中所述,Visual Explain还可以帮助您确定如何改进查询。您可以在添加索引之前和之后比较两个解释,以了解它们之间的差异。

答案 1 :(得分:1)

对于这个特定的查询,我建议使用一个复合索引,如:

CREATE INDEX map_ix1 ON myproject.MAP (end_ip, start_ip);

如果这是一个独特的组合,create unique index ...

此外,请勿在查询中使用*。如果您需要所有列,则显式声明列仍然更好(可维护性)。您还可以考虑覆盖索引(包含查询中访问的所有列的索引):

CREATE INDEX map_ix1 ON myproject.MAP (end_ip, start_ip, ...);

答案 2 :(得分:-1)

您的查询似乎有误:为什么要将IP地址作为数值比较? IP地址不是你可以有意义地比较的东西。

但是,由于您已经使用了地图数据(因为您有lat,long等),这意味着您应该使用空间扩展。好消息是空间索引允许您非常有效地执行这种类型的查询。您应该已经在(lat, long)上创建了空间索引,或者使用(lat, long)作为复合类型POINT - 这使您可以快速执行基于坐标的搜索。

如果您仍想比较IP地址,可以将元组(start_ip, end_ip)视为空间POINT并执行搜索属于您指定范围的此点。这将为您提供最佳性能。您可以详细了解空间扩展 here