为啥手动实现哈希标签可以提高查询的性能?

Posted

技术标签:

【中文标题】为啥手动实现哈希标签可以提高查询的性能?【英文标题】:Why does manually implementing a hash tag give a performance boost to my queries?为什么手动实现哈希标签可以提高查询的性能? 【发布时间】:2012-03-21 15:58:40 【问题描述】:

在我的模型中,我设置了一个实体(假设是人)以将属性作为字符串(称为“名称”)并在其上放置一个索引。如果我对我的模型进行大量查询,那么查询会导致性能消耗。我的查询很简单

  [ NSPredicate predicateWithFormat: @"%K == %@", @"name", lPersonName ];

所以我会假设索引会完成它的工作。

然后,如果我计算一些简单的哈希标记并将其与我的实体一起存储在索引整数属性(称为“哈希”)中,并进行更窄的查询,那么性能消耗就消失了。像这样:

[ NSPredicate predicateWithFormat: @"%K == %d AND (%K == %@)",
                           @"hash", [ self calculateHashForName: lPersonName ],
                           @"name", lPersonName ];

为什么整数索引比字符串索引快得多?我忽略了什么吗?这是核心数据问题吗?

当然,我可以使用井号标签来保留解决方案,但如果我忽略了某些事情,我希望尽快知道它。

【问题讨论】:

核心数据存储的类型是 SQLite,知道这一点可能很重要。 假设索引实体具有快速(错误)查找(***.com/questions/5337238/…)似乎是合理的。 问题是,为什么字符串上的索引不高效而整数上的索引...我编辑了我的问题以使其更清楚 这没有回答问题,但提供了其他优化可能性的线索:Testing Core Data with big hierarchical data sets 【参考方案1】:

在本机处理整数的低级计算机上,处理器具有整数的内部数据类型,但没有字符串的内部数据类型(无论如何在 ARM 和 x86 领域)。

4000000000 == -123456789 

计算机可以在 1 条指令中处理,而...

"Abcdefg" == "Abcdefzzzz"

必须遍历字符,接受几条指令。

这是相当笼统的,但它触及了问题的症结所在。简而言之,计算机处理整数的速度更快,即使字符串可以表示为整数(二进制字节),它们也是可变长度的,这使得它们处理起来更加复杂。

【讨论】:

我明白......我想我的问题是:如果你在一个字符串上放置一个索引,为什么 SQLite 不使用哈希标签做一些基本的优化来优化性能,所以我不不必?也许我应该在 SQLite 邮件列表上问这个?【参考方案2】:

有(至少)两种可能性:

    名称字符串的大小大于整数,因此字符串索引所需的存储空间更大。数据库性能直接受存储大小的影响,因为查找的成本是通过磁盘寻道来衡量的(暂时忽略缓存),并且数据越大,需要的寻道次数就越多

    SQLite 将表存储在 B 树中,并且可以使用 INTEGER PRIMARY KEY 以最高效率查找记录,而无需额外索引——从您的代码中(对我来说)不清楚哈希是否正在用作整数主键

【讨论】:

以上是关于为啥手动实现哈希标签可以提高查询的性能?的主要内容,如果未能解决你的问题,请参考以下文章

GitGit 标签使用 ( 查询哈希码 | 创建标签 git tag v1.0 | 查询标签 git tag | 查询标签信息 git show v1.0 | 创建标签并指定说明 | 删除标签 )(代

GitGit 标签使用 ( 查询哈希码 | 创建标签 git tag v1.0 | 查询标签 git tag | 查询标签信息 git show v1.0 | 创建标签并指定说明 | 删除标签 )(代

为啥数据库读写分离可以提高性能

为啥我的解决方案这么慢,如何提高查询的性能?

隐藏或删除 uiLabels 以提高性能

手动检索带有 JSON 类别/标签的 Wordpress 帖子