Проблема с индексацией в postgres

#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);