在 MySQL 8 中使用点数据类型和 st_distance_sphere 查找最近的地点

2024-04-20

我有一张桌子叫place:

id | name       | coordinates (longitude, latitude)
1  | London     | -0.12574, 51.50853
2  | Manchester | -2.25, 53.41667
3  | Glasgow    | -4.25, 55.86667

The coordinates列是点数据类型。我将点插入place表使用:

st_geomfromtext('point($longitude $latitude)', 4326)

请注意,我已经使用了 SRID。

给定任何坐标,我想找到距离它最近的位置(按升序排列)。我目前提出的解决方案(通过阅读 MySQL 文档)如下所示:

select
    *,
    st_distance_sphere(`place`.`coordinates`, st_geomfromtext('Point($longitude $latitude)', 4326)) as distance
from place
order by distance asc;

在这里和其他地方查看了无数类似的问题后,很明显这是一种鲜为人知(且较新的方式)的做事方式,因此没有太多内容,因此我正在寻求一些澄清。

我的问题是:

  1. 这是最好的解决方案/我这样做对吗?
  2. 这个方法会利用我在coordinates column?
  3. 使用时st_距离_球体 https://dev.mysql.com/doc/refman/8.0/en/spatial-convenience-functions.html#function_st-distance-sphere,我是否需要指定地球的半径才能获得准确的结果? (编辑:不,它默认使用地球半径)

编辑,以下是这些答案:

explain select ...;返回:

id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra
1  | SIMPLE      | place | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 115687 | 100.00   | Using filesort

flush status; select ...; show session status like 'Handler%';返回:

Variable_name              | Value
Handler_commit             | 1
Handler_delete             | 0
Handler_discover           | 0
Handler_external_lock      | 2
Handler_mrr_init           | 0
Handler_prepare            | 0
Handler_read_first         | 1
Handler_read_key           | 1001
Handler_read_last          | 0
Handler_read_next          | 0
Handler_read_prev          | 0
Handler_read_rnd           | 1000
Handler_read_rnd_next      | 119395
Handler_rollback           | 0
Handler_savepoint          | 0
Handler_savepoint_rollback | 0
Handler_update             | 0
Handler_write              | 0

It may是最好的解决方案。让我们先得到一些其他答案......

什么是EXPLAIN SELECT ...说? (这可能会回答你的问题2)。

无论其他答案如何,您的查询都将扫描整个表。也许你想要LIMIT ...最后?

另一件可能有用的事情(取决于您的应用程序和优化器):向WHERE clause.

无论如何,请执行以下操作以准确了解实际触摸的行数:

FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';

带着这些答案回来;那么也许我们可以进一步迭代。

显示状态后

Well, Handler_read_rnd_next说这是全表扫描。 1000 和 1001——你有吗LIMIT 1000?

我推断LIMIT没有考虑到如何SPATIAL作品。也就是说,它执行简单的操作 - (1) 检查所有行,(2) 排序,(3)LIMIT.

那么该怎么办?

计划 A:确定您不希望结果超过 X 英里 (km),并向查询添加“边界框”。

B 计划:放弃 Spatial 并深入研究更复杂的方法来完成任务:http://mysql.rjweb.org/doc.php/latlng http://mysql.rjweb.org/doc.php/latlng

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MySQL 8 中使用点数据类型和 st_distance_sphere 查找最近的地点 的相关文章

  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat
  • 为什么我的浮点数大于 1 时在 MYSQL 中存储为 .9999?

    我将进程时间作为 float 4 4 存储在 MySQL 数据库中 start time microtime TRUE things happen in my script end time microtime TRUE process t
  • INNER JOIN 后从多个表获取最大日期

    我有以下两个表 table 1 ID HOTEL ID NAME 1 100 xyz 2 101 pqr 3 102 abc table 2 ID BOOKING ID DEPARTURE DATE AMOUNT 1 1 2013 04 1
  • 日志中每天的每周活跃用户数

    我想知道是否有人可以帮助我使用一些 SQL 来返回两天或更长时间内登录到数据库表的唯一用户数量 让我们使用 7 天作为参考 我的日志表在每一行中包含时间戳 ts 和 user id 表示该用户当时的活动 以下查询返回此日志中的每日活跃用户数
  • Python 的 mysqldb 晦涩文档

    Python 模块 mysqldb 中有许多转义函数 我不理解它们的文档 而且我努力查找它们也没有发现任何结果 gt gt gt print mysql escape doc escape obj dict escape any speci
  • IN 子查询中的 GROUP_CONCAT

    SELECT A id A title FROM table as A WHERE A active 1 AND A id IN SELECT GROUP CONCAT B id from B where user 3 如果我启动子查询SE
  • 对于相同的查询,MySQL Workbench 比 Python 快得多

    MySQL Workbench 中的以下查询需要 0 156 秒才能完成 SELECT date time minute price id FROM minute prices WHERE contract id 673 AND TIMES
  • 通过Java从MySQL中获取大量记录

    有一个 MySQL 表 服务器上的用户 它有 28 行和 100 万条记录 也可能会增加 我想从这个表中获取所有行 对它们进行一些操作 然后将它们添加到 MongoDB 中 我知道通过简单的 从用户中选择 操作来检索这些记录将花费大量时间
  • 更新 SQLAlchemy 中的特定行

    我将 SQLAlchemy 与 python 一起使用 我想更新表中等于此查询的特定行 UPDATE User SET name user WHERE id 3 我通过 sql alchemy 编写了这段代码 但它不起作用 session
  • 在 MySQL 中执行触发器需要什么权限?

    我发现 MySQL 手册中对 DEFINER 的解释令人困惑 因此我不确定运行应用程序的 执行用户 需要什么权限 为了安全起见 我喜欢将 执行用户 限制为所需的最少权限 我知道触发器 存储过程的创建者需要超级权限 但是 执行用户 是否也需要
  • 如何获取knex / mysql中所有更新记录的列表

    这是我正在处理的查询 return knex table returning id where boolean false andWhere fooID foo id update boolean true limit num then f
  • SQL 按计数排序

    如果我有一个表和这样的数据 ID Name Group 1 Apple A 2 Boy A 3 Cat B 4 Dog C 5 Elep C 6 Fish C 我希望根据 Group 的总和从小到大进行排序 例如 A 2条记录 B 1条记录
  • 在shell命令行中创建mysql触发器

    我需要在命令行中创建一个mysql触发器 这个sql在mysql控制台中运行良好 sql USE DB1 DROP TRIGGER IF EXISTS my trigger DELIMITER CREATE TRIGGER my trigg
  • 在 Laravel 中按数据透视表 create_at 排序

    在我的数据库中 我有以下表格 courses id 名称 创建时间 更新时间 students id 名称 创建时间 更新时间 课程 学生 id course id student id created at updated at 我正在尝
  • 如何比较行内的重叠值?

    我似乎对这个 SQL 查询有问题 SELECT FROM appts WHERE timeStart gt timeStart AND timeEnd lt timeEnd AND dayappt boatdate 时间格式为军用时间 物流
  • MYSQL 的 Google OAuth 2.0 用户 ID 数据类型

    我正在实施 Google OAuth 2 0 并注意到 Google OAuth 返回的唯一用户 ID 是21位数字长的 我想大整数 20 足以满足这种需求 但我现在看到 Google OAuth 返回的用户 ID 的长度感到困惑 关于我应
  • 选择前 n 个字符相等的行(MySQL)

    我有一张带有玩家句柄的桌子 如下所示 1 N Laka 2 N James 3 nor Brian 4 nor John 5 Player 2 6 Spectator 7 N Joe 从那里我想选择第一个 n 字符匹配的所有玩家 但我不知道
  • 无法在类上找到适当的构造函数

    我正在尝试将本机 SQL 结果映射到 POJO 但它返回错误 这是完整的堆栈跟踪 Hibernate SELECT FROM members tb where memberName like 2019 12 19 07 40 20 688
  • 当与“<”或“>”运算符一起使用时,MySQL 不使用 DATE 上的索引吗?

    我正在使用解释来测试这些查询 col 类型是 DATE 这使用索引 explain SELECT events FROM events WHERE events date 2010 06 11 这不 explain SELECT event
  • 如何在 codeigniter 查询中使用 FIND_IN_SET?

    array array classesID gt 6 this gt db gt select gt from this gt table name gt where array gt order by this gt order by q

随机推荐

  • 如何在make后运行.o文件

    我一直在尝试运行一个 C 程序https github com rinon Simple Homomorphic Encryption https github com rinon Simple Homomorphic Encryption
  • 从 AWS EC2 MySQL 数据库迁移到 Azure MySQL 数据库导致性能非常差且缓慢

    我们有一个非常小的 150MB 的 MySQL 数据库 它在 AWS t2 large 数据库作为自托管的情况下运行得非常快 硬件规格 Azure 2 个 vCPU 10 GB 内存 AWS 2 个 vCPU 8 GB 内存 不过 该公司决
  • 拉取部署、github 操作和 ssh 密钥

    比方说 我想使用 GitHub 操作和拉取策略来设置部署流程 所以我有一个 Ubuntu 服务器 我复制服务器的公共 ssh 密钥 将其添加到我的 GitHub 帐户 然后我可以从 Ubuntu 服务器克隆 构建并运行应用程序 那太好了 但
  • KeeperErrorCode = /admin/preferred_replica_election 的 NoNode

    当我启动kafka时 zookeeper发生错误 INFO Got user level KeeperException when processing sessionid 0x156028651c00001 type delete cxi
  • Xcode `Archive` 功能是否自动使用 `Release` 构建配置?

    我的标准工作流程 当将应用程序发布到 App Store 时 是按Product gt Archive从 Xcode 的菜单栏 我意识到我从来没有改变过 XcodeBuild Configuration在我的构建方案中 我已将其设置为Deb
  • 如何在 Swift 中实现 UIPageControl

    好吧 我在这里苦苦挣扎 无法找到有效的解决方案 我一直在自学 Swift 没有 Objective C 经验 我知道 我知道 在我的应用程序中 我有我的主要UIViewController 一个透明但从屏幕底部滑入的子视图 然后滑动子视图的
  • UISlider自定义图像和拇指高度?

    我正在创建 或尝试 自定义 UISlider 外观 仍然水平但更高 我有两个问题 1 这是我用来将图像放到滑块上的代码 UIImage minImage UIImage imageNamed sliderMin png UIImage ma
  • 如何将 Admin SDK api 添加到 android 项目

    我目前正在开发一个需要管理员和普通用户的 Android 应用程序 举例来说 管理员可以管理普通用户 例如删除 修改其内容 根据我的研究 firebase提供的Admin SDK API确实可以解决这个问题 但根据他们的文档 Admin S
  • 带 slimscroll 的水平滚动条

    我使用 slimscroll 来满足我的滚动需求 效果很好 现在我需要水平滚动 快速的谷歌搜索给了我一些 github 源代码中的参考结果和一些问题 这些问题表明已经添加了水平滚动支持 但我找不到示例 我查看了 javascript 文件
  • 流星构建中的箭头功能导致 Heroku 部署崩溃

    我在heroku上部署了一个使用meteor的js应用程序 构建在 localhost 上运行 但在 heroku 服务器上失败 我检查了日志并发现了这一点 js 312 12 2017 03 18T03 29 07 070711 00 0
  • Java swing 1.6 像firefox bar一样的文本输入

    我想创建一个看起来像 Firefox 地址栏的文本小部件 组件 我的意思是一个文本字段 它允许我在字段内放置小按钮 例如取消 重新加载 我尝试通过创建自定义布局管理器来自定义 JLayeredPane 该布局管理器最大化文本字段 并将其余部
  • Android:带有 RippleEffect 和 StateListAnimator 的

    我有一个布局 其中包括另一个布局
  • firebase 是否处理推送通知?

    我正在调查 firebase 和 Angularfire 是否适合我即将进行的项目 要求之一是当应用程序关闭时向用户发送新的私人消息时通知用户 即 推送通知 firebase 可以处理这个问题吗 是的 不过 直到最近才出现这种情况 感谢 l
  • 检查输入是否在 C++ 的限制范围内

    我需要创建多个函数来检查输入是否有效 这是我的一些代码 bool IsValidRange signed char s bool isValid true if s gt SCHAR MIN s lt SCHAR MAX isValid f
  • 在单个 Activity 中的 Fragment 之间切换

    我想创建一个Activity它显示了用户可以浏览的一种菜单 通过单击一个项目 将显示一个新屏幕 为用户提供更多选项 类似于向导 我想使用这个来实现Fragments 但这对我不起作用 现在我有 main xml
  • 如何从Flash/AS3找到用户Temp文件夹的路径?

    如何从 Flash AS3 找到用户临时文件夹的路径 例如 C Users lisnil AppData Local Temp 它需要在任何版本的 Windows 上运行 至少是 XP Vista 和 7 您无法通过 Flash 那样访问文
  • F#:将字符串选项转换为字符串的最短方法

    目标是转换一个string option这是通过一些很好的类型计算得出的一个简单的string然后可以传递到 UI printf URL 其他只想要一个字符串并且对选项类型一无所知的东西 None应该变成空字符串 显而易见的方法是做一个ma
  • 标签 朋友 照片

    我使用此代码 但出现错误 致命错误 未捕获 OAuthException 121 第 1106 行 home a283357 public html app base facebook php 中抛出无效照片 ID 我的代码用于标签 dat
  • 单击菜单按钮后,如何在启动新活动之前显示插页式广告?

    我使用选项菜单按钮转到第二个活动 当用户单击该菜单按钮时 启动第二个活动后会显示插页式广告 但我想在启动第二个活动之前显示插页式广告 当用户单击插页式广告的关闭按钮时 第二个活动应该启动 我正在使用下面的代码来显示插页式广告 case R
  • 在 MySQL 8 中使用点数据类型和 st_distance_sphere 查找最近的地点

    我有一张桌子叫place id name coordinates longitude latitude 1 London 0 12574 51 50853 2 Manchester 2 25 53 41667 3 Glasgow 4 25