У меня нет mySQL для тестирования, но мне любопытно, насколько эффективен его INTERSECT:
select points.*
from points
join
(
select id from points where x > 100 AND x < 200
intersect
select id from points where y > 100 AND y < 200
intersect
select id from points where z > 100 AND z < 200
) as keyset
on points.id = keyset.id
Не обязательно рекомендовать это - но это что-то попробовать, особенно если у вас есть отдельные индексы наx, y и z.
РЕДАКТИРОВАТЬ: поскольку mySQl не поддерживает INTERSECT, запрос выше может быть переписан с использованием JOINS встроенных представлений.Каждое представление будет содержать набор ключей, и каждое представление будет иметь преимущество отдельных индексов, которые вы поместили в x, y и z.Производительность зависит от числа возвращаемых ключей и алгоритма пересечения / соединения.
Сначала я протестировал подход пересечения (в SQLite), чтобы увидеть, есть ли способы повысить производительность в пространственных запросах, кроме использования их модуля R-Tree.INTERSECT фактически медленнее, чем использование одного несоставного индекса для одного из пространственных значений, а затем сканирование поднабора базовой таблицы для получения других пространственных значений.Но результаты могут отличаться в зависимости от размера базы данных.После того, как таблица достигла гигантского размера и дисковый ввод-вывод становится более важным фактором производительности, может оказаться более эффективным пересечение дискретных наборов ключей, каждый из которых был создан из индекса, чем сканирование последующего базового столав начальную выборку из индекса.