- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
因此,大多数数据库专家表示,相对于表的大小,在唯一值很少的列上创建索引是无效的。
基于数据库内部的工作方式(我知道大多数数据库使用 B 树存储索引),为什么具有很少唯一值的 B 树会使搜索效率低下?
最佳答案
首先,您需要了解列索引的工作原理。简单来说就是,
an ordered list of all possible values in the given column with a pointer back to the actual record in the database.
由于它是有序的,因此可以对其使用二分搜索,而不是线性搜索,这可以提高大型数据集的性能。
想象一下,您的索引是按列排序的电话簿,例如 last name
;但在具有类似 last name
的记录集中,记录没有共同的模式或有意义的顺序:它们纯粹是随机排列的。并说我们需要搜索这条记录:
Ike Smith 4783 Random Ave. Seattle, WA 98117
由于电话簿是由 last name
订购的,我们只需要转到 S
, 然后是 m
, 然后是 i
等,直到我们找到 Smith
.并且(希望如此)在 Smith
下只有几条记录。所以我们很快就能找到我们想要的那个。
现在,假设您有一本由 city
订购的电话簿而不是 last name
.在匹配给定 city
的记录中没有特定的顺序。所以我们再次尝试搜索。但是,一旦我们找到 Seattle
(使用极其复杂的二进制搜索)我们剩下将近 620,778 条记录,我们必须按顺序检查它们,因为它们完全随机排序。我们一直在检查每个 条目以查找我们想要的记录。
当您使用一个非常常见的列作为索引的基础时会发生这种情况:二分搜索返回一个非常大的可能记录集,数据库无法对这些记录进行超出初始索引列值的任何假设,因此它需要在结果集中按顺序检查匹配记录。
如果电话簿是由 zip code
订购的(一个不太常见的变量),那么您可能会发现自己只搜索驻留在 98117
上的 18,623 条记录.
此外,真正的电话簿通常类似于复合索引:不是仅按单个列排序(即 last name
),结果集中的值然后按另一列排序(例如 first name
),并且然后是另一个(middle name
?),这样搜索就可以在每一步都以亚线性方式完成,直到找到所需的记录。它基本上是索引中的索引,即使第一列不是那么常见,与第二列的组合提供了足够具体的标准,只需要线性搜索一小部分记录。
关于database - 为什么唯一值很少的列上的索引无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17309779/
我有 python 应用程序,它需要每天执行大约 20 000 次专有应用程序(不时崩溃)。 问题是当应用程序崩溃时,Windows 会自动触发 WerFault这将使程序挂起,因此 python's
我弄清楚这里的问题是什么。很少(50 个数据中有 3 个)插入到数据库中的数据不完整,如下所示: 用于插入的 PHP 代码是正确的。数据库中没有值的所有值都来自 SELECT 标记 HTML(year
我有一个包含对象的列表,其中包含以下字段:完整、不完整、继续。我想根据这三个部分对我的列表进行排序。首先,我想添加 header: INCOMPLETE 和所有元素(如果此字段为真)。之后我想添加标题
我们有一个名为模型的包 在模型中,我们有一个 TopicM 模块,它定义了一个类 Topic我们将它导入同一个包中名为 GeneralM 的模块中。有时(很少)我们会收到此错误: 可能是什么原因?会不
通过简单地将 TextViews 文本设置为在代码中定义的字符串(永远不能是 null)我有时会得到一个 ArrayIndexOutOfBoundsException,这只发生在我的实时应用程序中,我
我在 NodeJS 中运行一个 restify 服务器。在极少数情况下,大约 0.05% 的 HTTPS 请求会导致 net.js 报告以下错误: Error: accept EPERM at
我不明白,为什么Eclipse更新变得如此不可靠?大约每次使用它时,我都会遇到一些问题! 例如,现在我遇到下面一堆谵妄。禁用“联系所有软件站点”没有帮助。 An error occurred whil
为了呈现一堆节点,每帧一个,直到它们都出现在屏幕上,我想在 update() 调用中做这样的事情。 警告,伪代码接近: update(){ switch presentNodes_inOrderOfA
此 NSPersistentStoreCoordinator 没有持久存储。它无法执行保存操作。 NSInternalInconsistencyException(SIGABRT) This NSPe
我是一名优秀的程序员,十分优秀!