Иерархические данные в MySQL так быстро, как XML, чтобы извлечь? - PullRequest
2 голосов
/ 19 апреля 2010

У меня есть список всех стран -> штатов -> городов (-> населенных пунктов / деревень и т. Д.) В файле XML, и для получения, например, всех городов штата это действительно быстро с XML (с использованием анализатора XML).

Интересно, если я положу всю эту информацию в mysql, будет ли поиск по всем городам штата так же быстро, как с XML? причина XML предназначен для хранения иерархических данных, в то время как реляционные базы данных, такие как mysql, не предназначены.

список содержит около 500 000 объектов. так что мне интересно, если это так же быстро, как XML, используя любой из:

Модель списка смежности

Модель Nested Set

А какую мне использовать? Потому что (теоретически) в состоянии может быть неограниченное количество уровней (я слышал, что смежность не подходит для неограниченных дочерних уровней). И какой самый быстрый для этого огромного набора данных?

Спасибо!

1 Ответ

3 голосов
/ 19 апреля 2010

В этой статье Quassnoi создает таблицу с 2,441,405 строками в иерархической структуре и проверяет производительность высокооптимизированных запросов для вложенных множеств и списков смежности. Он запускает множество различных тестов, например, выбор предков или потомков и время их получения (подробнее читайте в статье):

                                      Nested Sets    Adjacency Lists
All descendants                        300ms         7000ms
All ancestors                           15ms          600ms
All descendants up to a certain level 5000ms          600ms

Его вывод заключается в том, что для MySQL вложенные наборы быстрее запрашивать, но имеет недостаток, заключающийся в том, что его обновление выполняется намного медленнее. Если у вас есть нечастые обновления, используйте вложенные наборы. В противном случае предпочитайте списки смежности.

Вы также можете рассмотреть возможность использования другой базы данных, которая поддерживает рекурсивные CTE.

Я бы предположил, что для анализа XML-файла такого размера потребуется достаточно много времени, но если вы сможете кэшировать проанализированную структуру в памяти, а не читать ее с диска каждый раз, тогда запросы к ней будут очень быстрыми. 1010 *

Обратите внимание, что основным недостатком использования MySQL для хранения иерархических данных является то, что он требует некоторых очень сложных запросов. Хотя вы можете просто скопировать код из статьи, на которую я ссылался, если вам когда-нибудь понадобится немного изменить его, вам придется понять, как он работает. Если вы предпочитаете, чтобы все было просто, то XML определенно имеет преимущество, поскольку он был разработан для данных такого типа, и поэтому вы легко сможете создавать запросы, которые вам нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...