我有一个在 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 占位符。本质上,此查询的目标是获取表中当前位于由查询中的 4 个坐标限制的 Google 地图窗口的视口中的所有坐标点。
我已经限制了使用 Google Maps API 运行此查询的缩放级别,因此可以获取的最大行数是~5600。随着缩放级别的增加,最终的获取总数会显着降低。
直接在 PHPMyAdmin 中运行这样的示例查询需要 1.40-1.45 秒。这太长了。我已经在运行标准索引ref_coord_lat
,ref_coord_long
这使查询时间从大约 5 秒缩短,但这对于最终用户期望及时响应的地图来说仍然太大了。
我的问题很简单:如何进一步优化此表/查询以提高获取结果的速度?