不知道这是不是一个正确的问题,但出于好奇,我想知道哪个会被快速搜索。对于 Ex-
<A>
<Name>John</Name>
</A>
或者
<A>
<Name n="John"/>
</A>
我已经存储了数百万个文本作为属性值,尽管字符大小不够大。以上只是为了更好地理解问题的一个例子。
现在,如果使用 XML 数据库,如 BaseX、eXists 等,我尝试搜索或创建所有名称并为其编制索引,那么哪个会更快?
这是依赖于实现的,因此不能对所有 XML 数据库进行概括。尽管在这个简单的情况下,我想所有数据库都是一样的:没关系。
我将为 BaseX 解释这里会发生什么。假设您使用第一个结构并且想要获取<A/>
元素。所以你使用 XPath
//A[Name = "John"]
这将针对以下查询进行优化:
db:text("your-database", "John")/parent::*:Name/parent::*:A
而您的第二个数据结构的 XPath 可能看起来像这样:
//A[Name/@n = "John"]
这将被优化为
db:attribute("your-database", "John")/self::*:n/parent::*:Name/parent::*:A
正如您所看到的,除了一个路径步骤多(因为您必须访问该属性),这是非常便宜的,主要区别在于使用db:text()
vs. db:attribute()
. 但正如所记录的,这两个函数都将使用值索引(如果存在)(默认情况下),并且由于索引查找而将非常快。
实际上,如果您正在设计一个基于 XML 的应用程序并希望稍后使用 XQuery 检索信息,那么您肯定会遇到其他瓶颈,例如使用查询的非索引或嵌套的 for 循环。