Про тайловый сервер я писал в другой статье, по этому повторяться не буду. Тут другая проблема возникла — скорость работы прям удручает…
В чем причина?
Если долго разбираться, то в итоге проблема обнаруживается в СУБД. Скорость выполнения запроса 10 секунд — многовато. Когда тайлы начинают складываться, то карта жутко медленно загружается. Значит нужно что-то с ними сделать.
Что получилось?
Немного поотлавливав запросы в логах, я начал находить запросы, которые выполнялись по 3-4 секуды, а некоторые вообще 10-25 секунд. Это слишком много, даже если мы закэшируем все возможные варианты, ждать придется долго. В итоге у меня получился такой набор индексов:
CREATE INDEX idx_planet_osm_polygon_1 ON planet_osm_polygon (way_area DESC, name, boundary, admin_level, osm_id);
CREATE INDEX idx_planet_osm_polygon_2 ON planet_osm_polygon (way_area DESC, building, landuse, "natural");
CREATE INDEX idx_planet_osm_polygon_3 ON planet_osm_polygon USING gist(way) WHERE
(
(landuse = ANY (ARRAY['forest'::text, 'farmland'::text, 'residential'::text, 'commercial'::text, 'retail'::text, 'industrial'::text, 'meadow'::text, 'grass'::text, 'village_green'::text, 'vineyard'::text, 'orchard'::text]))
OR ("natural" = ANY (ARRAY['wood'::text, 'wetland'::text, 'mud'::text, 'sand'::text, 'scree'::text, 'shingle'::text, 'bare_rock'::text, 'heath'::text, 'grassland'::text, 'scrub'::text]))
)
AND building IS NULL;
CREATE INDEX idx_planet_osm_polygon_4 ON planet_osm_polygon (way_area DESC);
CREATE INDEX idx_planet_osm_point_osm_id ON planet_osm_point(osm_id);
CREATE INDEX idx_planet_osm_polygon_osm_id ON planet_osm_polygon(osm_id);
CREATE INDEX idx_planet_osm_line_osm_id ON planet_osm_line(osm_id);
Одни запросы сократились до 700мс, некоторые другие примерно 3,5 секунды. Это уже интереснее и гораздо быстрее, чем было ранее.
Нужно больше индексов
В директории openstreetmap-carto я наткнулся еще на один файла: indexes.sql. Соответственно создал индексы из него, но не проверял на сколько там стало лучше.
Что в итоге?
В итоге генерация тайлов прям ожила на глазах. Сотрудник прям оценил по сравнению с предыдущим этапом. С такой картой уже можно работать!