#postgresql
#postgresql
Вопрос:
Невозможно ускорить работу базы данных из-за индексации.
Я создаю таблицу:
CREATE TABLE IF NOT EXISTS coordinate( Id serial primary key,
Lat DECIMAL(9,6),
Lon DECIMAL(9,6));
После этого я добавляю индексацию:
CREATE INDEX indeLat ON coordinate(Lat);
CREATE INDEX indeLon ON coordinate(Lon);
Затем таблица заполняется:
INSERT INTO coordinate (Lat, Lon) VALUES(48.685444, 44.474254);
Введите 100 тысяч случайных координат.
Теперь мне нужно вернуть все координаты, которые включены в радиусе N км от заданной координаты.
SELECT id, Lat, Lon
FROM coordinate
WHERE acos(sin(radians(48.704578))*sin(radians(Lat)) cos(radians(48.704578))*cos(radians(Lat))*cos(radians(Lon)-radians(44.507112))) * 6371 < 50;
Время выполнения теста составляет примерно 0,2 секунды, и если вы не выполните СОЗДАНИЕ ИНДЕКСА, время не изменится. Я подозреваю, что в запросе ошибка, может быть, вам нужно как-то его перестроить?
Прошу прощения за мой английский
Ответ №1:
Индекс может использоваться только в том случае, если индексированное выражение точно соответствует тому, что у вас есть на непостоянной стороне оператора. Очевидно, что здесь дело не в этом.
Для подобных операций вам необходимо использовать расширение PostGIS. Затем вы можете определить таблицу, подобную:
CREATE TABLE coordinate (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
p geography NOT NULL
);
и запрос, подобный этому:
SELECT id, p
FROM coordinate
WHERE ST_DWithin(p, 'POINT(48.704578 44.507112)'::geography, 50);
Этот индекс ускорил бы запрос:
CREATE INDEX ON coordinate USING gist (p);