在 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 查找最近的地点 的相关文章

  • Mysql - Mysql2::错误:字符串值不正确:

    所以我建造了一个刮刀并拉动一些物体 问题是有些是外语 它使 mysql 数据库有点崩溃 这是我得到的错误 知道我能用这个做什么吗 谢谢 Mysql2 错误 列的字符串值不正确 xC5 x8Dga 第 1 行的 描述 插入sammiches
  • Java 从 SQL 数组获取 ResultSet 失败

    我试图从数据库中检索电子邮件地址 但没有成功 我的代码如下 Main System out println PortfolioData getEmails 58 So Far Returning null 投资组合数据 public sta
  • 在 MySQL 数据库中存储图像文件或 URL?哪个更好? [复制]

    这个问题在这里已经有答案了 可能的重复 在数据库中存储图像 是还是否 https stackoverflow com questions 3748 storing images in db yea or nay 数据库中的图像与文件系统中的
  • 使用mysql在一个查询中选择多个表中的子项总数

    我整个下午都在尝试处理一个查询 或两个或三个 以获得三个表的所有子表的计数 看看我的设计 用户表 id user name 1 foo 2 bar 赢表 id won user 1 1 2 1 3 2 绘制表格 id draw user 1
  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • 使用 google geocoding api jquery 从经度和纬度获取城市名称

    我想从经度和纬度获取城市名称 我正在使用以下代码 但它返回包含城市名称 邮政编码 省份和国家 地区的完整地址 我只想要城市名称 ajax url http maps googleapis com maps api geocode json
  • MySQL 按主键排序

    某些 SQL 服务器允许使用通用语句 例如ORDER BY PRIMARY KEY 我不相信这适用于 MySQL 是否有任何此类解决方法可以允许跨多个表自动选择 或者是否需要查找查询来确定主键 我一直在研究的解决方法包括调用SHOW COL
  • C#:SQL 查询生成器类

    在哪里可以找到好的 SQL 查询构建器类 我只需要一个简单的类来构建 SQL 字符串 仅此而已 我需要它用于 C 和 MySql 我真的不需要像 Linq 或 NHibernate 这样的东西 谢谢 由于 Google 将我引导至此页面 我
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • 为什么 MySQL 创建带有 _seq 后缀的表?

    我创建了一个 InnoDB 表 名为foo在 MySQL 中 一旦我对表执行插入操作 我就会看到另一个表foo seq被建造 如果我删除自动生成的表 它会在下一次插入后出现 是什么原因造成的 听起来像是正在创建一个序列 您是否有自动生成的主
  • 无法启动 MySQL 服务器 - 控制进程退出并出现错误代码

    我的 mysql 服务器停止后无法启动 命令使用 sudo etc init d mysql restart Error 重新启动 mysql 通过 systemctl mysql serviceJob for mysql service
  • 查询中列的顺序重要吗?

    当从 MySQL 表中选择列时 与表中的顺序相比 选择列的顺序是否会影响性能 不考虑可能覆盖列的索引 例如 您有一个包含行 uid name bday 的表 并且有以下查询 SELECT uid name bday FROM table M
  • MYSQL - 查找最近的前一天

    我可以以某种方式 不使用 PHP 找到一周中最近的前一天日期吗 Like 最近的上一个星期二的日期是哪一天 CURDATE INTERVAL WEEKDAY CURDATE wday IF WEEKDAY CURDATE gt wday 0
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL

随机推荐

  • 如何在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