B-Tree
índices não ajudarão muito para tal consulta. O que você precisa como uma
R-Tree
index e a consulta paralelepípeda de limite mínimo sobre ele. Infelizmente,
MySQL
não suporta R-Tree
índices sobre 3d
pontos, apenas 2d
. No entanto, você pode criar um índice sobre, digamos, X
e Y
juntos que serão mais seletivos que qualquer um dos B-Tree
índices em X
e Y
sozinho: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;
Isso só é possível se sua tabela for
MyISAM
.