gpt4 book ai didi

mysql - mysql 中的索引是如何工作的?

转载 作者:行者123 更新时间:2023-11-29 05:36:29 26 4
gpt4 key购买 nike

我想了解 MySql 中的索引是如何工作的。我有几个关于索引的问题。

首先是我们是否必须索引只有唯一值的列,或者我们是否可以索引值可以重复的列,例如。姓。我知道索引姓氏是愚蠢的,但我想了解它是如何工作的。所以我的理解是……

例如。表中有 1000 条记录。并且有 400 个姓氏重复。所以如果我们索引“lastname”,mysql 将采用所有唯一值并为它们建立索引,当搜索查询被触发而不是在 1000 条记录中搜索时,它只会遍历 600 条索引记录,其中甚至包括一次重复值,只是节省时间。

有点像......

姓氏:-

史密斯

约翰逊

琼斯

棕色

戴维斯

史密斯//重复

JHONSON//重复

史密斯//重复

棕色//重复

威廉姆斯

MySql 索引

  1. 史密斯

  2. 约翰逊

  3. 琼斯

  4. 布朗

  5. 戴维斯

  6. 威廉姆斯

我说得对吗……?

最佳答案

您的前提有些正确。执行查找 (SELECT) 的性能索引的好处。如果您有一个包含 1,000 个姓氏的列表(不管唯一名称的数量),并且您想要找到等于“Smith”的那些,您将必须查看所有 1,000 行以查找哪些条目(如果有)与您的匹配询问。这可能会非常慢,因为它会根据您拥有的行数(无论唯一行数如何)而变差。

现在假设您的名字按姓氏的字母顺序排列。如果您想查找姓氏为“Smith”的任何条目,您可以进行“二进制搜索”:选择中间条目并查看姓氏按字母顺序是小于还是大于“Smith”。如果更少,则丢弃名称的前半部分,只处理后半部分。选择剩余名称的中间条目并将其与 Smith 等进行比较......

您所做的是减少搜索时间。现在,您不必检查所有 n 个条目来查找“Smith”,而只需检查 log(2)n 个条目,对于较大的 n 值,它可以小得多。

这基本上就是索引所做的,除了经常使用的 B+ 树(类似于上面提到的二叉树方法,但具有一些额外的好属性)会有所帮助。

关于您的唯一性问题,是的,您可以将索引应用于非唯一列。索引通常用于必须唯一的列(例如主键),因为如果没有索引,维护列的唯一性可能会非常昂贵。例如,假设您想添加一个姓氏为“Smith”的条目,但您对“姓氏”列有唯一约束。你怎么知道是否已经有一个名为“Smith”的条目?你必须搜索它。如果没有索引,那将需要检查 n 个条目;有一个索引,只有 log(2)n。因此,在唯一列上保留索引通常是一个好主意,以保持合理的性能。

此外,the Wikipedia article关于数据库索引更详细地回答了您的问题。

关于mysql - mysql 中的索引是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10125841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com