mysql中的索引如何工作?

时间:2012-04-12 14:37:05

标签: mysql indexing

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

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

对于Eg。表中有1000条记录。并且有400个姓氏重复。所以,如果我们索引 “lastname”,mysql将获取所有唯一值并对其进行索引,当搜索查询被触发而不是在1000条记录中搜索时,它将只通过600条索引记录,这些记录甚至包括重复值一次,只是节省时间。 / p> 像......这样的事情。

姓氏: -

SMITH

JOHNSON

JONES

布朗

戴维斯

SMITH //重复

JHONSON //重复

SMITH //重复

布朗//重复

WILLIAMS

MySql索引

  1. SMITH

  2. JOHNSON

  3. JONES

  4. 布朗

  5. DAVIS

  6. WILLIAMS

  7. 我是否正确....?

3 个答案:

答案 0 :(得分:2)

有几个索引,但我们可以使用btree。该索引是二叉树,每个节点有两个分支。

制作索引 你创建了一个二进制树,剩下一半的值,另一半是正确的。最简单的方法是用数字来看它:如果你有数字1到6你就会在顶部创建一个5的树,然后用1和3创建2,而右边你有5个用4和6作为叶子。

搜索带索引的内容 你基本上要问的是“这个节点'是'还是'更多',然后是你正在寻找的价值。所以你问第一个节点(丢弃你的一半价值),然后往下走,这意味着你只需要搜索{ {1}}索引的值为log(n)值。要“找到”3,你要与5和2进行比较,你就是。这对于大数字来说是快速的。

答案 1 :(得分:2)

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

现在假设你的名字按姓氏按字母顺序排列。如果要查找姓氏为“Smith”的任何条目,可以进行“二分搜索”:选择中间条目,然后按字母顺序查看姓氏是否小于或大于“Smith”。如果它少了,那就丢掉名字的前半部分,只处理后半部分。选择其余名称的中间条目并将其与史密斯等进行比较......

您所做的就是缩短搜索时间。现在,您不必检查所有n个条目以查找“Smith”,而只需检查log(2)n个条目,对于较大的n值,这些条目可能要小得多。

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

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

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

答案 2 :(得分:-1)

阅读MySQL手册的"Optimization and Indexes"部分。