Java 如何使我的查询选择速度超过200万条记录
在这里,我需要一个解决我的问题的方法。我有一个表,其中包含200万条与地理坐标相关的记录。要从表中获取特定行,查询执行时间将为24秒。在这里,我想为我的应用程序方面选择500条以上的记录。因此,任何人都可以为我的查询提供更快的解决方案 质疑Java 如何使我的查询选择速度超过200万条记录,java,mysql,sql,hql,mysql-workbench,Java,Mysql,Sql,Hql,Mysql Workbench,在这里,我需要一个解决我的问题的方法。我有一个表,其中包含200万条与地理坐标相关的记录。要从表中获取特定行,查询执行时间将为24秒。在这里,我想为我的应用程序方面选择500条以上的记录。因此,任何人都可以为我的查询提供更快的解决方案 质疑 您需要在start\u ip和end\u ip列上创建索引。有关语法和不同类型的索引,请参见 如注释中所述,可视化解释还可以帮助您确定如何改进查询。您可以比较添加索引之前和之后的两种解释,以了解它们的不同之处。对于此特定查询,我建议使用如下组合索引: CRE
您需要在
start\u ip
和end\u ip
列上创建索引。有关语法和不同类型的索引,请参见
如注释中所述,可视化解释还可以帮助您确定如何改进查询。您可以比较添加索引之前和之后的两种解释,以了解它们的不同之处。对于此特定查询,我建议使用如下组合索引:
CREATE INDEX map_ix1 ON myproject.MAP (end_ip, start_ip);
如果这是唯一的组合,创建唯一索引…
另外,不要在查询中使用*。如果您需要所有列,那么(为了可维护性)显式声明这些列更好。还可以考虑覆盖索引(包含查询中访问的所有列的索引):
您的查询似乎有误:为什么要将IP地址作为数字值与任何内容进行比较?IP地址不是可以进行有意义比较的东西 但是,由于您已经在使用地图数据(如lat、long等),这意味着您应该使用空间扩展。好消息是,空间索引允许您非常高效地执行这类查询。您应该已经在
(lat,long)
上创建了空间索引,或者使用(lat,long)
作为复合类型点
-这允许您快速执行基于坐标的搜索
如果仍要比较IP地址,可以将tuple
(start\u IP,end\u IP)
视为空间点
,并对属于指定范围的该点执行搜索。这将为您提供尽可能高的性能。您可以阅读有关空间扩展的更多信息显示您的一些查询,这样每个人都可以轻松地调整您的查询queries@PandiyanCool补充道query@AnkitBajpai我想在所有行中选择一行。如何将选择限制在500。在start\u ip
和end\u ip
上创建索引。这应该会加快速度。同时发布表结构(即,表上存在哪些数据类型和索引)使用工作台中的解释(和可视化解释)功能来帮助确定如何改进此查询。正如Ean所建议的,添加这些索引,您会注意到解释计划发生了变化。研究解释和索引以获取更多信息。是学习索引和调优的一个很好的免费资源。它还提供了不同数据库的示例。对于单值查询,执行速度很快…但选择20个值会再次占用太多时间…每个查询占用事务开始时间:1403241044326 milleseconds事务结束时间:1403241077426 milleseconds。总时间为:54315 m/s@AravindCheekkallur选择超过20个值是什么意思?@Ean这里我将ip转换为一个数字,然后使用该数字执行查询。索引后,单个数字的搜索速度更快。但我有100多个IP。现在查询速度越来越慢,composit索引和其他索引之间是否有显著差异?我尝试了@Ean发布的内容。但是它的速度仍然慢于20个值。复合索引(在查询中使用所有列)几乎总是比几个单列索引好。谢谢,我也将尝试使用它。要创建复合索引,我可以从该表中删除已添加的索引。或者自动删除查询中使用的列?您可能需要尝试一个索引,如(end\u ip,start\u ip,)好的,您可能需要在索引的末尾包含这些索引。我还建议从开始ip开始,比如:在myproject.map上创建索引映射ix1(结束ip、开始ip描述、lat、lng、县id)
。在start_ip上使用单列索引应该会有更好的性能
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
CREATE INDEX id_index ON myproject.MAP (start_ip);
CREATE INDEX map_ix1 ON myproject.MAP (end_ip, start_ip);
CREATE INDEX map_ix1 ON myproject.MAP (end_ip, start_ip, ...);