如何在数据库中保存大面积的测量点,以便快速选择?



问题

我不确定如何保存大面积的测量数据,以便可以从数据库中快速检索。

测量数据

测量数据包括:

  • 经度
  • 纬度度
  • 信号功率
  • 发射器 ID

每个区域可能有多个发射器。

描述来自单个发射器的信号的数据存储在文件中。从一个文件中,我创建了大约 200 万行(具有信号功率的点)。由于信号强度变化,应保存所有数据。

对于只有一个发射器的表,从特定点(经度、纬度)选择在任何公共相对方向 (←↑↑→↓) 上为 +/-x米的点大约需要 0.5 秒。

问题所在

我必须在单个查询中显示大约 65000 个点的信号,因此计算它需要相当长的时间(65000x05 s)。

我做了什么

我决定将每个发射器保存到一个单独的表中。在主表中,我只保存左下角和右上角的坐标(这样我就可以确定哪个发射器表由点旁边的点组成,我可以从该特定表中选择数据)。但是,问题仍然存在,因为我的表仍有大约 200 万行。

主表,其中保存了所有变送器:

╔════╦═══════════════════════════════════════════════════════════════
═ ��╦═══════════════════════════════════════════════╗ ║ ID ║ left_lower_corner_lon ║ left_lower_corner_lat ║ right_upper_corner_lon ║ right_upper_corner_lat ║ ╠════╬═══════════════════════╬═══════════════════════╬════════════════════════╬════════════════════════╣ ║ 1 ║ 12 ║ 48 ║ 13 ║ 49 ║ ║ 2 ║ 12.5 ║ 48 ║ 14 ║ 50 ║ ╚

══════════════════════════════════════════════════════╩ ════════════════════════════════════════════════════╝现在是单个发射器的表(i. e. transmitter_1):

╔════════╕══════════╦════════════╗
║ 朗 ║ 纬度 ║ 西格 ║ ╠═════════╬═════════╬═══════════╣ ║ 48,0004 ║ 12,0002 ║ -123,0000 ║ ║ 48,0004 ║ 12,0003 ║ 124,0000 ║ ╚══

══════════════════════════════现在为了从特定点的所有发射器获取信号,首先我选择传输器的id,然后在下表中查找最近的点。但是对于一个点(0.5秒)来说,这已经太长了。

我的查询

#in order to test, im using these variables:
SET @_lon = 13.729520117164848;
SET @_lat = 51.126581079972624;
SELECT lat, lon, sig, SQRT(
POW(69.1 * (lat - @_lat), 2) +
POW(69.1 * (@_lon - lon) * COS(lat / 57.3), 2)) AS distance
FROM (SELECT * FROM `transmitter_1` WHERE (lon <= @_lon+0.00009 && lon >= @_lon-0.00009 && lat <= @_lat+0.00009 && lat >= 0.00009)) AS nearest_points
HAVING distance < 25  ORDER BY distance LIMIt 1;

我的想法

我相信我为单个发射器创建了更多表格,并再次保存了 2 个角的坐标。

  1. 如何在表中的行数和 php 的性能时间之间找到折衷方案?
  2. 我应该在我的sql(作为函数)而不是php中创建整个链吗?我会为一个点节省超过 0.005 秒吗?
    • 选择由点组成的变送器表
    • 然后为包含该点的变送器选择一个零件表
    • 最后选择最近的点作为MySQL函数

每当在"where"中输入字段时,请确保该字段已编制索引。您还可以尝试使用多字段索引(如果您总是按 lon 和 lat 搜索,请放入包含这两个字段的索引)。

这就是速度的来源。我见过通过适当的索引将花费数小时(字面意思)减少到几秒钟的查询。

在包含数百万条记录的表上,您还可以尝试使用单独的表、单独的数据库来分段数据,还可以查看对数据库中的数据进行分区。

但在你去那里之前:索引。

运行查询。索引 lon,然后索引纬度(只是索引,不是唯一的或主要的)。再次运行它。然后在同一索引中索引 long 和 lat 在一起,并再次运行查询。比较你的时代。您应该会看到响应时间显著减少。

最新更新