повышение производительности по запросу SELECT с большим набором данных 3D-точек - PullRequest
6 голосов
/ 12 февраля 2011

У меня есть большой набор данных (около 1,9 миллиона строк) трехмерных точек, из которых я выбираю. Утверждение, которое я использую чаще всего, похоже на:

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 запрос быстрее?

Ответы [ 2 ]

6 голосов
/ 12 февраля 2011

B-Tree индексы мало помогут для такого запроса.

То, что вам нужно, как индекс R-Tree и минимальный ограничивающий параллелепипедный запрос над ним.1007 * не поддерживает R-Tree индексов над 3d точками, только 2d.Однако вы можете создать индекс, скажем, вместе X и Y, который будет более избирательным, чем любой из B-Tree индексов только на X и Y:

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.

0 голосов
/ 12 февраля 2011

У меня нет 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 фактически медленнее, чем использование одного несоставного индекса для одного из пространственных значений, а затем сканирование поднабора базовой таблицы для получения других пространственных значений.Но результаты могут отличаться в зависимости от размера базы данных.После того, как таблица достигла гигантского размера и дисковый ввод-вывод становится более важным фактором производительности, может оказаться более эффективным пересечение дискретных наборов ключей, каждый из которых был создан из индекса, чем сканирование последующего базового столав начальную выборку из индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...