Справочная информация:
Мне нужно хранить в базе данных следующие данные:
Узлы, которые образуют ребра, которые являютсяв тех же «путевых» наборах должны быть те же теги, что и в этих путях, т. е. каждый узел в «путевом» наборе узлов, являющихся магистралью, должен иметь метку «магистрали».
Мне нужна эта структура, чтобылегко создать график на основе различных фильтров, например, график, состоящий только из узлов и ребер, являющихся магистралями, или график «пешеходных дорожек» и т. д.
Проблема:
Раньше я не слышал о пространственном индексе, поэтому я просто проанализировал файл .osm в базе данных MySQL:
- все узлы в таблице узлов (с соответствующими столбцами координат) - ОКоколо 9 000 000 строк в моем случае:
(INSERT INTO nodes VALUES [pseudocode]node_id,lat,lon[/pseudocode]
;
- все пути к таблице 'ребер'e (обычно один путь создает несколько ребер) - хорошо, около 9 000 000 строк:
(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 лет, если размер таблицы «ребер» превышает 9 000 000 строк, как в моем случае).
Htop показывает / usr / bin / mysqldпроцесс, который занимает 40-60% ЦП.
Та же проблема существует для скрипта, который пытается вычислить вес (расстояние) ребра (выбрать все ребра, взять ребро, затем выбрать два узлаэто ребро из таблицы «узлов», затем рассчитайте расстояние, а затем обновите таблицу ребер.)
Вопрос:
Как я могу ускорить обновление SQL?Должен ли я настроить какие-либо параметры конфигурации MySQL?Или я должен использовать PostgreSQL с расширением PostGIS?Должен ли я использовать другую структуру для моих данных?Или мне как-то использовать пространственный индекс?