我有一个数据库,其中有很多汽车位置(坐标;纬度,经度)。我想通过将坐标提供给服务器来获得汽车的位置,并很快地获得位置。问题在于,汽车的数量众多,并且在请求时,如果表中有数百万条记录,则
select *
from locations
where (lat >= '$lat-10' and lat <= '$lat+10') and
(lng >= '$lng-10' and lng <= '$lng+10')
这可能是正常的,但是它将四种条件下的数百万个坐标进行比较,并且非常利用资源。那么,有什么算法可以非常快速地找到位置吗?我认为用正方形对我国的地图进行分类并将每个部分放在单独的表格中以快速找到位置是否是一个好主意。因此,如果用户仅通过给出他/他的当前坐标来查找汽车的位置,则SQL将仅在用户当前所在的部分(表)中搜索。但是现在的问题是,表的数量将增长很多,也许会增加到100,000个表!
编辑
CREATE TABLE `locations` (
`car_id` int(10) UNSIGNED NOT NULL,
`car_code` varchar(8) COLLATE utf8mb4_unicode_ci NOT NULL,
`lat` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`lng` tinytext COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `locations`
ADD PRIMARY KEY (`car_id`);
还是我应该在SQL中使用索引?如果是,我该怎么做?这是答案index
如何快速找到汽车的位置? 谢谢
答案 0 :(得分:0)
确保不需要在数据之间进行无用的转换,因此在表架构和查询中使用相同的数据类型pr和lng。 (如果db中的lat,lng是十进制,请不要使用字符串来传递vars值..最终是正确的绑定) 确保在两个
的表位置上都有复合索引仅选择选择中真正需要的列,并将这些列添加到复合索引中,例如:
select col1,col2,col3
from locations
where (lat >= :lat-10 and lat <= :lat+10) and (lng >= :lng-10 and lng <= :lng+10);
CREATE INDEX idx_lat_lng ON locations (lat,lng, col1, col2, col3);