我在 XML 文件中获得了所有国家 -> 州 -> 城市(-> 子城市/村庄等)的列表,并且要检索例如一个州的所有城市,使用 XML(使用 xml 解析器)非常快。
我想知道,如果我将所有这些信息放入 mysql 中,检索一个州的所有城市是否与使用 XML 一样快?因为 XML 旨在存储分层数据,而像 mysql 这样的关系数据库则不是。
该列表包含大约 500 000 个实体。所以我想知道使用以下任一方法是否与 XML 一样快:
邻接列表模型
嵌套集模型
我应该使用哪一个?因为(理论上)一个状态下可能有无限的级别(我听说邻接对于无限的子级别来说并不好)。对于这个庞大的数据集来说,哪一个最快?
谢谢!
最佳答案
在 this article 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 文件需要相当长的时间来解析,但是如果您可以将解析后的结构缓存在内存中而不是每次都从磁盘读取,那么对其进行查询将会非常快。
请注意,使用 MySQL 存储分层数据的主要缺点是它需要一些非常复杂的查询。虽然您可以复制我链接到的文章中的代码,但如果您需要稍微修改它,那么您将必须了解它是如何工作的。如果您希望保持简单,那么 XML 绝对具有优势,因为它是为此类数据设计的,因此您应该能够轻松创建所需的查询。
关于mysql - MySQL 中的分层数据检索速度与 XML 一样快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2664357/