Mysql空间索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql空间索引相关的知识,希望对你有一定的参考价值。

参考技术A 在涉及LBS的服务开发过程中,经常需要存储地理空间的位置并进行一定计算(附近商家等需求),本文主要介绍mysql对于LBS的支持。

Mysql的空间扩展主要提供一下几个方面的功能:

其中前两点对InnoDB,MyISAM,NDB,ARCHIVE等mysql存储引擎都支持,第三点只有对InnoDB和MyISAM的支持,由于InnoDB的支持行锁以及事务的特性,现在基本上已经是默认存储引擎了,所以本文以下内容都默认使用InnoDB。

创建空间列以及空间索引的语句如下:

Mysql的空间数据类型与OpenGIS的数据类型相对应。

Mysql的空间数据有不同表示格式,其中咱能看懂的也就第一种

因为上文提到了SRID,这里说下什么是SRID,SR是指Spatial Reference,也就是我们常说的空间参考系,mysql支持卡迪尔坐标系和地理坐标系,其中地理坐标系又有好多种,下面说几种常用的空间参考系

Mysql的所有空间坐标系都存在表 mysql.st_spatial_reference_system 中,这个表是隐藏的,看不见的,但是你可以通过 infomation_shcema.st_spatial_reference_system 中查看参考系的信息,这个表就是 mysql.st_spatial_reference_system 的一个视图的实现。

mysql的空间索引的数据结构是R树,R树实际上就是多维的B树,B树的数据结构在我的另一篇博客中有介绍,这里就不展开了,说几点在应用的时候需要注意的。

最后转一篇博文 https://visonforcoding.github.io/di-li-wei-zhi-geochu-li-zhi-mysql-geo-suo-yin.html

在 MySQL 数据库上运行迁移时出现实体框架错误。 “空间/全文/哈希索引和显式索引顺序的错误使用”

【中文标题】在 MySQL 数据库上运行迁移时出现实体框架错误。 “空间/全文/哈希索引和显式索引顺序的错误使用”【英文标题】:Getting an Entity Framework error running migrations on a MySQL database. "Incorrect usage of spatial/fulltext/hash index and explicit index order" 【发布时间】:2018-11-04 14:33:30 【问题描述】:

问题

在对新安装的 MySQL 数据库(对 SQL Server 数据库运行良好)运行迁移时,它在第一次创建表时失败并出现错误:

空间/全文/哈希索引和显式索引顺序的错误使用

当它尝试运行以下Index 方法时会发生这种情况:

CreateTable(
    "dbo.AuditLog",
    c => new
    
        Id = c.Int(nullable: false, identity: true),
        Name = c.String(maxLength: 1000, unicode: false),
        What = c.String(maxLength: 1000, unicode: false),
        When = c.DateTime(nullable: false, precision: 6),
        Why = c.String(maxLength: 1000, unicode: false),
        Where = c.Int(nullable: false),
        Who_Id = c.String(maxLength: 128, unicode: false),
    )
    .PrimaryKey(t => t.Id)
    .ForeignKey("dbo.AspNetUsers", t => t.Who_Id);
    .Index(t => t.Who_Id);

Update-Database 上使用-verbose 标志后,我看到导致此错误的命令如下。

CREATE index  `IX_Who_Id` on `AuditLog` (`Who_Id` DESC) using HASH

在线搜索对于解决这个问题并不是很有用。我见过的最接近的是this Stack Overflow question,但它对我不起作用。


背景

针对旧的(大约 3 年前)MySQL 数据库运行迁移工作正常,但是当我安装新的 MySQL 时,我收到有关密码身份验证的错误,这将通过更新 MySQL NuGet 包或强制执行该用户来解决使用旧密码。有关此问题,请参阅 here。

我将我的 MySQL NuGet 包更新到了​​最新版本,这导致了一个不同的错误(可以看到 here),我通过降级到比我开始使用的包更新的包解决了这个问题,但低于人们所使用的最新包提到 API 无法正常工作。

所以在这个阶段它连接良好,但似乎数据库本身不喜欢实体框架生成的索引命令。

如有必要,我很乐意提供更多信息。

版本

MySql.Data 6.10.7 MySql.Data.Entity 6.10.7 EntityFramework 6.2.0 MySql 数据库 8.0.11 社区

更新

我通过手动执行 SQL 命令并在针对 MySql 实例时替换 .Index() 调用,设法让它在 MySql 上运行。

然而,即使在显然成功运行迁移之后,MySql.Data(.Entity) 仍然会出现运行时错误。

将数据库恢复到以前的 MySql 5 主要版本时,代码可以完美运行,无需任何更改。

我会等待一段时间,让 NuGet 包和 MySql 数据库更新,然后再试一次。

【问题讨论】:

这可能会有所帮助:***.com/questions/49945561/… 8.0 开始在索引声明中尊重DESC 【参考方案1】:

这太容易了。我搜索了错误消息并想出了EF: Incorrect usage of spatial/fulltext/hash index and explicit index order 解释了消除该错误的两个步骤——删除

.Index(t => t.Who_Id)

并添加

Sql("CREATE index `IX_Who_Id` on `AuditLog` (`Who_Id` DESC)");

我希望 Entity Framework 正在监听并修复代码。

【讨论】:

嗨瑞克,感谢您的回答。正如我在帖子中提到的那样,我知道这个问题,不幸的是它最初并没有为我工作。当使用该方法并删除 DESC 时,它确实允许迁移运行。但是,即使在运行迁移之后,我仍然遇到问题。最后我意识到这一切都只发生在 MySql 8 上,这是一个非常新的主要版本。我会更新我的帖子。【参考方案2】:

不确定它是否能解决你的问题,但

    我认为您需要重新考虑 Who_ID 上的 FK,因为字符串会使 对于坏的FK。查看StackExchange 提出的解决方案。 当我有复杂的数据库并尝试时,我通常会遇到问题 并使用流利的 API 编写脚本。我通常把这个分开 进入步骤,首先是表,然后是索引,然后是关系。

这是否解决了您的问题,也许您可​​以发布一些 DDL,以便我们更好地帮助您解决您的问题?

【讨论】:

【参考方案3】:

看到这个answer

在此我创建一个继承类,覆盖一个函数并在 configuration.cs 上设置我的自定义类

【讨论】:

以上是关于Mysql空间索引的主要内容,如果未能解决你的问题,请参考以下文章

分析mysql索引信息及空间占用

mysql表结构表空间和索引的查询

MySQL 索引

为什么mysql不利用这个空间索引?

空间索引的空间索引类型

聊聊MySQL几大索引类型:B-Tree索引,哈希索引,R-Tree空间数据索引,全文索引