gpt4 book ai didi

mysql - 大面积的测量点如何存入数据库,以便快速选取?

转载 作者:可可西里 更新时间:2023-11-01 08:39:12 26 4
gpt4 key购买 nike

问题

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

详情

测量数据

测量数据包括:

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

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

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

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

问题

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

我做了什么

我决定将每个发射器保存到一个单独的表中。在主表中,我只保存左下角和右上角的坐标(这样我可以确定哪个发射机表由一个点旁边的点组成,我可以从该特定表中选择数据)。但是,问题仍然存在,因为我的表仍有大约 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 ║╚════╩═══════════════════════╩═══════════════════════╩════════════════════════╩════════════════════════╝

and now tables for single transmitters (i.e. transmitter_1):

╔═════════╦═════════╦═══════════╗║   lon   ║   lat   ║    sig    ║╠═════════╬═════════╬═══════════╣║ 48,0004 ║ 12,0002 ║ -123,0000 ║║ 48,0004 ║ 12,0003 ║ 124,0000  ║╚═════════╩═════════╩═══════════╝

Now in order to get signals from all transmitters for a specific point, first I select the id of the trasmitter and after that i look in the next table for the nearest point. But it takes too long already for only one point (0.5 s.).

My query

#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(只是索引,不是唯一的或主要的)。再次运行它。然后在同一个索引中将 long 和 lat 一起索引并再次运行查询。比较你的时间。您应该会看到响应时间显着减少。

关于mysql - 大面积的测量点如何存入数据库,以便快速选取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44705926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com