Справочная информация:
Мне нужно сохранить в базе данных следующие данные:
узлы osm с тегами;
osm ребра с весами (то есть ребро между двумя узлами, извлеченное из 'way' из файла .osm).
Узлы, образующие рёбра, которые находятся в одном и том же наборе «путей», должны иметь те же теги, что и эти пути, то есть каждый узел в наборе узлов «путь», который представляет собой шоссе, должен иметь тег «шоссе».
Мне нужна эта структура, чтобы легко создавать график на основе различных фильтров, например. граф, состоящий только из узлов и ребер, которые являются шоссе, или граф «пешеходных дорожек» и т. д.
Проблема:
Раньше я не слышал о пространственном индексе, поэтому просто проанализировал файл .osm в базе данных MySQL:
- все узлы в таблицу 'узлов' (с соответствующими столбцами координат) - ОК, в моем случае около 9000000 строк:
(INSERT INTO nodes VALUES [pseudocode]node_id,lat,lon[/pseudocode]
;
- все пути к таблице 'рёбер' (обычно один способ создает несколько рёбер) - ОК, также около 9000000 строк:
(INSERT INTO edges VALUES [pseudocode]edge_id,from_node_id,to_node_id[/pseudocode]
;
- добавить теги к узлам, вычислить веса для ребер - Проблема:
Вот проблемный скрипт php:
$query = mysql_query('SELECT * FROM edges');
$i=0;
while ($res = mysql_fetch_object($query)) {
$i++;
echo "$i\n";
$node1 = mysql_query('SELECT * FROM nodes WHERE id='.$res->from);
$node1 = mysql_fetch_object($node1);
$tag1 = $node1->tags;
$node2 = mysql_query('SELECT * FROM nodes WHERE id='.$res->to);
$node2 = mysql_fetch_object($node2);
$tag2 = $node2->tags;
mysql_query('UPDATE nodes SET tags="'.$tag1.$res->tags.'" WHERE nodes.id='.$res->from);
mysql_query('UPDATE nodes SET tags="'.$tag2.$res->tags.'" WHERE nodes.id='.$res->to);`
Nohup показывает вывод для 'echo "$ i \ n"' каждые 55-60 секунд (что может занять более 17 лет, если размер таблицы 'edge' превышает 9 000 000 строк, как в моем случае).
Htop показывает процесс / usr / bin / mysqld, который занимает 40-60% ЦП.
Та же проблема существует для скрипта, который пытается вычислить вес (расстояние) ребра (выбрать все ребра, взять ребро, затем выбрать два узла этого ребра из таблицы 'узлов', затем вычислить расстояние, затем обновить край таблицы).
Вопрос:
Как я могу ускорить обновление этого SQL? Следует ли мне настроить какие-либо параметры конфигурации MySQL? Или мне следует использовать PostgreSQL с расширением PostGIS? Должен ли я использовать другую структуру для моих данных? Или надо как-то использовать пространственный индекс?