如何从数据库中获取坐标并在Map上快速显示?

carvr3hs  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(361)

我有一个数据库,其中有很多汽车的位置(坐标;拉丁美洲,液化天然气)。我想通过给服务器提供坐标来得到汽车的位置,并且很快得到位置。问题是,汽车的数量是众多的,如果一个表中有数百万条记录,那么在使用

select *
from locations
where (lat >= '$lat-10' and lat <= '$lat+10') and
      (lng >= '$lng-10' and lng <= '$lng+10')

这可能是正常的,但它比较了数百万个坐标与四个条件,它利用资源非常多。那么有没有什么算法可以很快找到位置呢?我想用正方形把我国的Map分类,并把每一部分放在一个单独的表格里,以便快速找到位置是否是个好主意。因此,如果用户只想通过提供当前坐标来查找汽车的位置,sql将只在用户当前所在的部分(表)中进行搜索。但现在的问题是,表的数量会增加很多,可能会增加10万个表!!
编辑

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中使用索引?如果是,我怎么做?这是答案索引吗
如何快速找到汽车的位置?谢谢

eoxn13cs

eoxn13cs1#

确保不需要在数据之间进行无用的转换,所以在表模式和查询中使用相同的数据类型pr lat和lng(如果lat,lng in db为十进制,则不要使用字符串传递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);

相关问题