Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中使用空间索引时性能不佳_Mysql_Database_Performance_Gis_Spatial - Fatal编程技术网

在MySQL中使用空间索引时性能不佳

在MySQL中使用空间索引时性能不佳,mysql,database,performance,gis,spatial,Mysql,Database,Performance,Gis,Spatial,我正在尝试一个小实验来推动一个不是地理空间的数据集,但它非常适合它,我发现结果有些令人不安。数据集是基因组数据,例如人类基因组,我们有一个DNA区域,其中基因等元素占据特定的起始和终止坐标(我们的X轴)。我们有多个DNA区域(染色体)占据Y轴。目标是返回沿单个Y坐标与两个X坐标相交的所有项目,例如LineString(起点1,终点2) 这个理论似乎很合理,所以我把它推进了一个现有的基于MySQL的基因组计划,并提出了一个表结构,如: CREATE TABLE `spatial_feature`

我正在尝试一个小实验来推动一个不是地理空间的数据集,但它非常适合它,我发现结果有些令人不安。数据集是基因组数据,例如人类基因组,我们有一个DNA区域,其中基因等元素占据特定的起始和终止坐标(我们的X轴)。我们有多个DNA区域(染色体)占据Y轴。目标是返回沿单个Y坐标与两个X坐标相交的所有项目,例如LineString(起点1,终点2)

这个理论似乎很合理,所以我把它推进了一个现有的基于MySQL的基因组计划,并提出了一个表结构,如:

CREATE TABLE `spatial_feature` (
  `spatial_feature_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `external_id` int(10) unsigned NOT NULL,
  `external_type` int(3) unsigned NOT NULL,
  `location` geometry NOT NULL,
  PRIMARY KEY (`spatial_feature_id`),
  SPATIAL KEY `sf_location_idx` (`location`)
) ENGINE=MyISAM;
external\u id
表示我们编码到此表中的实体的标识符&
external\u type
编码此类型的来源。一切看起来都很好,我输入了一些初步数据(30000行),似乎效果不错。当超过300万行标记时,MySQL拒绝使用空间索引,并且在强制使用时速度较慢(使用完整表扫描时为40秒,而使用完整表扫描时为5秒)。当添加更多数据时,索引开始使用,但性能损失仍然存在。强制关闭索引将查询时间缩短到8秒。我使用的查询如下所示:

select count(*)
from spatial_feature
where MBRIntersects(GeomFromText('LineString(7420023 1, 7420023 1)'), location);
进入这一领域的数据在Y维度上是非常密集的(想象一下,你已经记录了每一栋建筑、电话亭、邮箱和鸽子在一条很长的道路上的位置)。我在Java中测试了R索引如何处理这些数据,该领域的其他人也成功地将其应用于平面文件格式。然而,没有人将它们应用于数据库AFAIK,这是本测试的目标

有没有人在向空间模型添加大量数据时看到过类似的行为,而空间模型在某个特定轴上不是完全不同的?如果我反向使用坐标,问题仍然存在。如果这是原因,我正在运行以下设置

  • MacOS 10.6.6
  • MySQL 5.1.46
救命啊

还引入了解释计划

+----+-------------+-----------------+------+-----------------+------+---------+------+---------+----------+-------------+
| id | select_type | table           | type | possible_keys   | key  | key_len | ref  | rows    | filtered | Extra       |
+----+-------------+-----------------+------+-----------------+------+---------+------+---------+----------+-------------+
|  1 | SIMPLE      | spatial_feature | ALL  | sf_location_idx | NULL | NULL    | NULL | 3636060 |    33.33 | Using where |
+----+-------------+-----------------+------+-----------------+------+---------+------+---------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
重新编写的SQL如下所示

select count(0) AS `count(*)` from `arabidopsis_thaliana_core_7_60_9`.`spatial_feature` where intersects(geometryfromtext('LineString(7420023 1, 7420023 1)'),`arabidopsis_thaliana_core_7_60_9`.`spatial_feature`.`location`)
仍然没有突出显示此查询的性能如此差的原因

在阅读了@Fraser从中发布的文章后,问题似乎完全与索引不在内存中有关。如果我将类似的技术应用于本文中提到的技术(使键缓冲区确实非常大),然后强制查询使用索引查询时间Plume。我们仍然可以看到查询一个区域和搜索该区域的子集之间的延迟,但这一切都指向获得正确的索引负载

这个故事的寓意是什么?MySQL中的R索引在内存中之前的性能相当差,然后才具有优异的性能。对于我想和他们一起做的事情来说,这不是一个很好的解决方案,但它仍然提供了一个关于MySQL的有趣角度

谢谢大家的帮助

我们的目标是把所有的钱都带回来 两个X相交的项目 沿单个Y轴的坐标 协调

您是否考虑过使用包含多个字段的索引?比如:

CREATE INDEX spacial_search ON spatial_feature(y, x)

如果你使用的是一组有限的
y
值,这就是解决问题的方法。

我有遗传学学位,而且我是一名程序员,你不需要使用X和y作为你的命名法,它会变得太假了。。。你需要一个开始和停止位置(不是一个“轴”)和一个染色体编号。首先根据染色体编号,然后是位置,然后是位置,然后是染色体。(问题:你是在研究真核生物还是有两个阅读框的染色体?)

例:(其中“x”=位置,“y”=染色体)


顺便说一句,染色体是非常长的字符串(就像数据一样),你可以(为了加快速度,将它们转储为blob(即编码基因和垃圾DNA)

从解释计划中我们可以看到,尽管空间可能用于查询(“可能的_键”列),但它没有被使用(“键”列中的NULL)。 我不知道为什么它不是自动选择的,但是您可以通过使用“force index”子句在查询中指定它来明确指示MySql使用索引:

选择计数(*)
从空间分布特征

强制索引(sf_location_idx)--您确定关系数据库是一种发展方向吗?如果我是您,我会考虑将您的数据集推送到Solr或Elastic Search(可能将主数据集存储在其他位置)。这些引擎是为索引而构建的,您会注意到响应时间的差异。

您可能会在Cheers获得答案,因为信息会在那里发布。您也可以发布此查询的结果:解释MBR相交的空间_功能的扩展选择计数(*)GeomFromText('LineString(7420023 1,7420023 1)),位置);这将显示MySQL是如何执行它的。这可能会突出瓶颈。扩展问题以给出解释计划的结果。该计划仍然没有突出显示性能如此差的任何真正原因。阅读这篇文章-我试图将问题简化一点,以尝试接触更多的受众,希望这是我们生物信息学家所犯的错误。问题似乎不在于创建允许这种搜索的空间索引(我在编程内存中应用了相同的技术,取得了巨大成功)。此外,还可以使用MySQL的空间扩展。看起来,尽管MySQL的性能优于任何类型的此类数据索引(装箱、线性索引或最大功能大小),但索引必须在内存中。如果您在1台服务器上拥有2300个DBs,这将是一个破坏者。MySQL使用某些“默认值”编译如果你有勇气并且觉得自己有能力进入这个兔子洞,那就是forge.mysql的家伙们。你可以编译mysql,但必须遵守某些机制。这是核心,但可能是值得的。有一个叫做ZFS的东西,有一个pape
CREATE INDEX spatial_index_1 ON spatial_feature(chromosome, position);
CREATE INDEX spatial_index_2 ON spatial_feature(position, chromosome);