1

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

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

例如。一个表中有 1000 条记录。并且有 400 个姓氏重复。因此,如果我们索引“lastname”,mysql 将获取所有唯一值并对其进行索引,当搜索查询被触发而不是在 1000 条记录中搜索时,它只会遍历 600 条索引记录,其中甚至包括一次重复值,只是节约时间。

就像是.....

姓氏 :-

史密斯

约翰逊

琼斯

棕色的

戴维斯

史密斯//重复

约翰逊//重复

史密斯//重复

棕色 //重复

威廉姆斯

MySql 索引

  1. 史密斯

  2. 约翰逊

  3. 琼斯

  4. 棕色的

  5. 戴维斯

  6. 威廉姆斯

我对么....?

4

3 回答 3

2

有几个索引,但让我们以btree. 该索引是一个二叉树,每个节点有两个分支。

制作索引 你制作了一棵二叉树,其中一半的值在左边,另一半在右边。最简单的方法是用数字来看待它:如果你有数字 1 到 6,你会在顶部用 5 制作一棵树,然后用 1 和 3 制作 2,对了,你会用 4 和 6 作为叶子制作 5。

用索引搜索东西: 你基本上问的是“这个节点'少'还是'多'然后你正在寻找的值。所以你问第一个节点(丢弃一半的值),然后往下走,意思是您只需要搜索log(n)值以获取值的索引n。要“找到”3,您将与 5 和 2 进行比较,就可以了。这对于大数字来说非常快。

于 2012-04-12T14:43:08.080 回答
2

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

现在想象你的名字按姓氏的字母顺序排列。如果您想查找姓氏为“Smith”的任何条目,您可以进行“二分查找”:选择中间条目并按字母顺序查看姓氏是否小于或大于“Smith”。如果少的话,就扔掉前半部分的名字,只处理后半部分。选择其余名称的中间条目并将其与 Smith 等进行比较...

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

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

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

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

于 2012-04-12T14:44:15.157 回答
-1

阅读 MySQL 手册的“优化和索引”部分。

于 2012-04-12T14:44:42.977 回答