mysql - 使用大型 3D 点数据集提高 SELECT 查询的性能

标签 mysql sql

我有一个大型数据集(大约 190 万行),其中包含我要从中选择的 3D 点。我最常使用的语句类似于:

SELECT * FROM points 
WHERE x > 100 AND x < 200 
AND   y > 100 AND y < 200 
AND   z > 100 AND z < 200 
AND otherParameter > 10

我有关于 x、y 和 z 以及其他参数的指标。我也尝试过向 x、y、z 添加多部分索引,但这没有帮助。

关于如何使此 SELECT 查询更快的任何建议?

最佳答案

B-Tree 索引对此类查询帮助不大。

R-Tree 索引和对其的最小边界平行六面体查询需要什么。

不幸的是,MySQL 不支持 R-Tree 3d 点的索引,仅支持 2d。但是,您可以同时创建一个索引,例如 XY,这将比任何 B-Tree 索引更具选择性XY 单独:

ALTER TABLE points ADD xy POINT;

UPDATE  points
SET     xy = Point(x, y);

ALTER TABLE points MODIFY xy POINT NOT NULL;


CREATE SPATIAL INDEX sx_points_xy ON points (xy);

SELECT  *
FROM    points
WHERE   MBRContains(LineString(Point(100, 100), Point(200, 200), xy)
        AND z BETWEEN 100 and 200
        AND otherParameter > 10;

这只有在您的表是 MyISAM 时才有可能。

关于mysql - 使用大型 3D 点数据集提高 SELECT 查询的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4974299/

相关文章:

mysql - 您可以对 SHOW COLUMNS 或 DESC 的输出进行排序吗?

sql - SQL Server 中的作业历史记录

mysql - MySql 中条件的 LIMIT

mysql - 加载数据 infile 以 "_"分隔单词

Python MySQL插入错误必须是str,而不是AttributeError

sql - 没有 WHERE 子句的 SELECT NOT NULL 值

java - Spring Boot + docker-compose + MySQL : Connection refused

PHP 自动删除我在标识字符串中需要的零

php - 我的 SELECT 查询失败,我该如何解决?

sql - 从表中选择不在列表SQL中的值