我有一个具有以下结构的MySQL表:
CREATE TABLE IF NOT EXISTS `np_voxels` (
`world` VARCHAR(16) NOT NULL,
`x` INT NOT NULL,
`y` INT NOT NULL,
`z` INT NOT NULL,
`value` DOUBLE NOT NULL DEFAULT 0,
`property_id` INT NULL,
PRIMARY KEY (`world`, `x`, `y`, `z`) ,
INDEX `np_fk_voxels_properties_idx` (`property_id` ASC) ,
CONSTRAINT `np_fk_voxels_properties`
FOREIGN KEY (`property_id`)
REFERENCES `np_properties` (`property_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
我想要两个选择查询,这些查询可以在给定与特定条件匹配的起始体素的情况下找到所有连接的体素。一个WHERE world = @world AND value > @minvalue AND property_id IS NULL
和另一个WHERE world = @world AND property_id = @property_id
。
所使用的洪水填充算法应该足够快,以至于它不会引起明显的滞后(这将在游戏服务器上使用)。还应该有一个以查询无法消失的起始体素为中心的边界框。在y
轴上,这将从0
转到@ymax
。默认值为31
。对于x
和z
轴,这应该从起始@hdistance
或x
延伸出z
。
输入
@world
@startx
@starty
@startz
@minvalue
或@property_id
(取决于该计划正在寻找的内容。)@hdistance
默认:13
@ymax
默认:31
我在Google上搜索过,并且还没有在MySQL中找到现有的实现。我不明白更快更复杂的洪水填充算法是如何尝试自己编写的。
答案 0 :(得分:0)
不应在SQL中实现快速泛洪填充。您可以将所有需要的数据加载到适当的结构(可能是一些图形表示或3d数组,具体取决于数据的密度),并运行堆栈/队列或您可以用手头的编程语言编写的任何其他实现。泛型填充按定义是递归的(即使它通常是由循环实现的),并且SQL不擅长递归,也不擅长循环。
但是有一些东西可能会在mysql中使用,即使它不是一个普通的SQL解决方案。有一个特殊的引擎来处理图形 - OQGRAPH。它可以在MariaDB中使用,可能可以安装到MySQL。
它支持有效存储组合图,其中网格只是一种特殊情况,它可以计算最短路径和可达性。在示例页面中,它知道dijkstras
和breadth_first
- 后者应该可用作洪水填充实现。
根据您的需要,您应该能够编写更高效的内容,因为您可以根据自己的需要进行定制。但是如果你想试验并比较更多的实现,你可以尝试一下。