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

标签 mysql indexing

我想了解 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/

相关文章:

python - 从子列表列表中删除索引以返回它

mysql - 我无法在 Linux 上启动 MySQL - 错误 mysqld_safe

mysql - 如何在 for 循环和 insert 语句中使用粘贴函数和引号

php - 如何在 laravel 中生成自定义主 ID?

mysql - MySQL 临时表应该建立索引(或者有主键)吗?

ruby-on-rails - Rails 5.1 和 Postgres - 当其中一列是外键时,在两列上添加唯一约束

php - 重复输入键“PRIMARY”

PHP XML 错误 - 文档末尾有多余内容

日期时间字段上的 MySQL 索引不是 RANGE 类型,而是使用 INDEX 类型

sql-server - 组合索引与多个单一索引与全文索引的查询性能