我正在尝试推动一个非地理空间但非常适合的数据集的小实验,并且发现结果有些令人不安.数据集是基因组数据,例如人类基因组,其中我们有一个DNA区域,其中像基因这样的元素占据特定的起始和终止坐标(我们的X轴).我们有多个DNA区域(染色体)占据Y轴.目标是将沿着单个Y坐标交叉两个X坐标的所有项目带回,例如LineString(START 1,END 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;
Run Code Online (Sandbox Code Playgroud)
external_id表示我们在此表中external_type编码的实体的标识符并对其来源进行编码.一切看起来都不错,我推出了一些初步数据(30,000行),似乎效果很好.当这个增加超过300万行标记时,MySQL拒绝使用空间索引,并且当它被迫使用它时速度较慢(使用全表扫描时为40秒对5秒).当添加更多数据时,索引开始被使用,但性能损失仍然存在.强制索引关闭将查询降低到8秒.我正在使用的查询如下:
select count(*)
from spatial_feature
where MBRIntersects(GeomFromText('LineString(7420023 1, 7420023 1)'), location);
Run Code Online (Sandbox Code Playgroud)
进入这个数据的数据沿着Y维度是非常密集的(想象一下,就像你在很长的路上记录了每个建筑物,电话亭,邮箱和鸽子的位置).我已经测试了R-Indexes如何在Java中使用这些数据进行测试,以及该领域的其他人已经成功地将它们应用于平面文件格式.然而,没有人将它们应用于数据库AFAIK,这是该测试的目标.
有没有人在向空间模型添加大量数据时看到类似的行为,而空间模型沿着特定的轴并不是非常不同?如果我反转坐标使用,问题仍然存在.如果这是一个原因,我正在运行以下设置
救命!
还带来解释计划
+----+-------------+-----------------+------+-----------------+------+---------+------+---------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered …Run Code Online (Sandbox Code Playgroud) 我有一个问题,我需要组装一个Map,其最终大小在GBs(超过64GB),我不能假设该程序的用户将有这种怪物机器闲置.一个很好的解决方案是将这个映射分布在多个机器上,以便为每个实例提供更加适度的内存占用.
有谁知道可以执行此分片的库/工具套件?我不关心复制或交易; 只是传播这个内存需求.