当前位置: 首页 > 面试题库 >

在具有〜225万行的单个表上进行选择查询的优化技术?

华永新
2023-03-14
问题内容

我有一个在InnoDB引擎上运行的MySQL表,该表squares具有大约2,250,000行,其表结构如下:

`squares` (
   `square_id` int(7) unsigned NOT NULL,
   `ref_coord_lat` double(8,6) NOT NULL,
   `ref_coord_long` double(9,6) NOT NULL,
   PRIMARY KEY (`square_id`),
   KEY `ref_coord_lat` (`ref_coord_lat`),
   KEY `ref_coord_long` (`ref_coord_long`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

第一列square_id保存一个从0到2.25M的简单增量值,而ref_coord_lat&分别ref_coord_long保存一个点的一组以十进制度表示的纬度和经度坐标。

这是一个只读表。不会添加其他行,并且唯一需要针对它运行的查询如下:

SELECT * FROM `squares` WHERE 
  `ref_coord_lat` BETWEEN :southLat AND :northLat AND 
  `ref_coord_long` BETWEEN :westLong AND :eastLong

…冒号后面的值是PHP PDO占位符。本质上,此查询的目标是获取表中当前位于Google
Maps窗口视口中的所有坐标点,该坐标点由查询中的4个坐标界定。

我已经限制了使用Google Maps API运行该查询的缩放级别,因此可以提取的最大行数为 〜5600
。随着缩放级别的增加,最终的获取总量将显着减少。

直接在PHPMyAdmin中运行这样的示例查询需要1.40-1.45秒。这太长了。我已经在运行标准索引ref_coord_latref_coord_long这使查询时间从〜5秒减少了,但是对于最终用户期望及时响应的地图而言,这仍然太大了。

我的问题很简单:如何进一步优化该表/查询以提高获取结果的速度?


问题答案:

在上创建复合索引(lat, long)应该会很有帮助。

但是,正确的解决方案是看一下MySQL空间扩展。专门创建了空间支持来处理二维数据和针对此类数据的查询。如果创建适当的空间索引,则典型的查询性能应轻松超过上的复合索引的性能(lat, long)



 类似资料:
  • 注意:我无法访问与此问题相关的源代码/数据库。这两个表位于不同的服务器上。 我在一家第三方公司工作,该公司的系统与我们自己的系统集成。他们有一个运行类似这样的查询; 它在

  • 问题内容: 我有一个统计表,该表的增长速度非常快(每天约有2500万行),我希望针对选择进行优化,该表可容纳内存,并且服务器具有大量备用内存(32G,表为4G)。 我的简单汇总查询是: 统计信息是一个innodb表,在结束时间上有一个正常的索引。 注意:我确实计划添加汇总表,但是目前这是我所坚持的,并且我想知道是否有可能在没有其他应用程序代码的情况下对其进行修复。 问题答案: 我一直在做本地测试。

  • 问题内容: 我有以下查询: 分析表有6000万行,而交易表有3M行。 在此查询上运行时,我得到: 我已经不知道如何优化此查询了,因为它已经非常基础了。运行此查询大约需要70秒钟。 以下是存在的索引: 根据建议,在添加任何额外索引之前简化了两个表的架构,因为这并不能改善情况。 如果以上无法进一步优化。关于汇总表的任何实施建议都将非常有用。我们正在AWS上使用LAMP堆栈。上面的查询正在RDS(m1.

  • 我不能执行这个声明。

  • 问题内容: 主题表 SubjectToClass表 我需要列出的所有行,其中的表是不是在指定类的表。 我有这个但不能再走了 问题答案:

  • 问题内容: [TABLE]是具有超过7亿行的Oracle数据库表。运行6个小时后,我取消了SQL执行。 是否有任何SQL提示可以提高性能?或任何其他解决方案来加快速度? 编辑: 此查询将运行一次,然后再也不会运行。 问题答案: 首先,它是一次性查询还是循环查询?如果只需要执行一次,则可能要考虑以并行模式运行查询。无论如何,您都将不得不扫描所有行,您可以使用ROWID(自己动手做并行性)范围自己划分