B-Tree
indeksy niewiele pomogą w takim zapytaniu.
Czego potrzebujesz jako R-Tree
indeks i minimalnie ograniczające równoległościenne zapytanie nad nim.
Niestety, MySQL
nie obsługuje R-Tree
indeksy ponad 3d
punkty, tylko 2d
. Możesz jednak utworzyć indeks na, powiedzmy, X
i Y
razem, co będzie bardziej selektywne niż którekolwiek z B-Tree
indeksy na X
i Y
sam:
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;
Jest to możliwe tylko wtedy, gdy Twoja tabela to MyISAM
.