暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【MySQL】MySQL如何使用索引

直截了当 2021-06-25
439

本文总结于:【dev.mysql.com】

本次学习中的陌生单词和词组

ENGLISHCHINESE
in question被提及的;讨论中的;相关的
considered the same被认为是相同的

介绍

  • 索引被用于通过指定列的值快速查找一条或多条记录。没有索引的情况下,为了找到相关记录MySQL必须从第一条数据开始,然后读整个表。表越大,那么花费也就越多。

这个时候如果有一个索引被应用于相关列上,MySQL就可以快速的决定要查找数据文件的中间位置,而不是整个数据表。这比顺序的读取每一条记录来查找快得多。

大多数的MySQL索引(PRIMARY KEY,UNIQUE, INDEX and FULLTEXT)都会被保存在 B-Trees 结构中。例外情况:空间数据类型(原文作:Spatial Data Type)使用 R-Trees;MEMORY 表额外支持Hash Index;InnoDB 为全文搜索使用倒排索引(原文作:inverted lists for FULLTEXT indexes)

一般情况而言,索引被用作下面讨论中。特定于哈希索引的特征(被用于 MEMORY 表中)将在其他章节讨论

MySQL对这些操作使用索引:

  • 快速查找匹配WHERE子句的行。

  • 去除带选定的记录。如果在多个索引之间有一个选择,MySQL通常选择使用查找到最少数据的索引(即最具选择性的索引)。

    原文作:To eliminate rows from consideration. If there is a choice between multiple indexes, MySQL normally uses the index that finds the smallest number of rows (the most selective index)..感觉翻译的不够语义化,如果你知道更好的翻译方式,欢迎加我微信“备注 B站 ”

  • 如果表有一个多列索引,索引的最左端任何前缀都会被优化器使用来查找记录。例如:如果你有一个3-列的索引(col1, col2, col3),那么你就可以在(col1)、(col1、col2)和(col1、col2、col3)上建立了索引搜索功能。(如果你觉这段内容很迷惑,不要担心,我当时也迷惑。我后面会出专门的文章讲 多列索引 的)

    略带一笔,关于多列索引:

    多列索引(multiple-column index):MySQL可以创建复合索引(即多列上的索引)。一个索引最多可以由16个列组成。对于某些数据类型,可以索引列的前缀。

    对于此内容不是本节重点,将会专门出文章来讲,目前暂时了解这么多就可以了。如果有兴趣就关 **直截了当 公众号 或 B站的 极简视频 ** 吧

  • 从其他表中检索数据时(即执行join操作时)。如果将列声明为相同的类型和大小,那么MySQL可以更有效地使用列上的索引。关于这点,VARCHAR 和 CHAR 在被声明为一样的大笑的时候被认为是一样的,如:VARCHAR(10) 和 CHAR(10) 是一样的大小。

    注意:对于非二进制字符串列之间的比较,这两列应该使用相同的字符集。例如,将utf8列与latin1列进行比较,就不允许使用索引。

  • 查找特定索引列key_col的MIN()或MAX()值。由预处理器优化,该预处理器检查是否在索引中出现在key_col之前的所有关键部分上使用WHERE key_part_N = constant。在这种情况下,MySQL对每个MIN()或MAX()表达式执行一次键查找,并将其替换为常量。如果所有表达式都用常量替换,查询将立即返回。例如:

    SELECT MIN(key_part2),MAX(key_part2) FROM tbl_name WHERE key_part1=10;
    复制
  • 如果排序或分组是在可用索引的最左前缀上完成的,则对表进行排序或分组(例如,ORDER BY key_part1,key_part2)。如果所有的 key parts 后面都跟着 DESC, 这个 key 将会按倒序读入。

  • 在某些情况下,检索值而不是检索整条记录可以优化查询 。如果查询仅从表中使用包含在某些索引中的列,则可以从索引树中检索所选的值,以获得更快的速度

    SELECT key_part3 FROM tbl_name WHERE key_part1=1
    复制

    为查询提供所有必要结果的索引称为覆盖索引。

知识点延申 B-tree

B树:一种流行于数据库索引中的树型数据结构。该结构始终保持排序,从而可以快速查找精确匹配(等于运算符)和范围(例如,大于,小于和BETWEEN运算符)。此类索引可用于大多数存储引擎,例如InnoDB和MyISAM。

由于B树节点可以有许多子节点,因此B树与二叉树不同,后者限制为每个节点2个子节点。

与仅在MEMORY存储引擎中可用的哈希索引相反。MEMORY存储引擎也可以使用B树索引,如果某些查询使用范围运算符,则应该为MEMORY表选择B树索引。

重点总结:

  • MySQL大部分多因类型保存在B-tree中(这是为什么索引为加速检索的原理,务必掌握),此外个别情况会保存在R-tree和hash index中

  • B-tree的数据结构要掌握(关于B-tree未来会在B站出个视频为大家讲一下, B站名称 “极简视频”)

  • MySQL索引的几种使用场景(理解了B树,也就理解这些使用场景了)

  • 关于多列索引将会在接下来的文章中为大家着重介绍

  • 对于本总结由任何疑问欢迎 “abigtree123” 交流,请备注 B站


文章转载自直截了当,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论