10bet网址
MySQL 8.0参考手册
相关文件10bet官方网站 本手册下载 从本手册中摘录

8.3.1 MySQL如何使用索引

索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以找到相关的行。桌子越大,成本越高。如果表中有相关列的索引,MySQL可以快速确定在数据文件中寻求的位置,而不必查看所有数据。这比按顺序读取每一行要快得多。

大多数MySQL索引(首要的关键,独特的,指数, 和全文)储存于B树。例外:空间数据类型上的索引使用R树;内存表也​​支持散列索引;InnoDB使用倒排表全文索引。

通常,索引的使用如下面的讨论所述。特定于散列索引的特征(如在内存表格中描述了表格第8.3.9节“B树和哈希索引的比较”

MySQL在这些操作中使用了索引:

  • 找到匹配a的行在哪里迅速。

  • 从考虑中删除行。如果要在多个索引中进行选择,MySQL通常使用查找最小行数(最多行数)的索引可选择的索引)。

  • 如果表具有多列索引,则优化程序可以使用索引的任何最偏好的前缀以查找行。例如,如果您有三列索引(Col1,Col2,Col3),您有索引的搜索功能(col1),(col1,col2), 和(Col1,Col2,Col3)。有关更多信息,请参见第8.3.6节“多列索引”

  • 在执行联接时从其他表检索行。如果列声明为相同的类型和大小,MySQL可以更有效地使用列上的索引。在这种背景下,VARCHARchar如果被声明为相同的大小,则被认为是相同的。例如,VARCHAR (10)Char(10)是一样的尺寸,但是VARCHAR (10)Char(15)不是。

    对于非边界字符串列之间的比较,这两个列应使用相同的字符集。例如,比较aUTF8.柱子用A.latin1列禁止使用索引。

    如果不进行转换就不能直接比较值,那么比较不同的列(例如,将字符串列与时间列或数字列进行比较)可能会阻止使用索引。对于给定的值,例如1在数字列中,它可能比较在字符串列中的任何数量的值(如)比较' 1 ',' 1 ','00001',或'01 .e1'。这条规定了使用字符串列的任何索引。

  • 找到MIN()或者最大限度()特定索引列的值key_col。这由预处理器进行优化,检查您是否使用在哪里key_part_n.=不变在以前发生的所有关键部件key_col在索引中。在这种情况下,MySQL为每个键查找MIN()或者最大限度()表达式并将其替换为一个常量。如果所有表达式都被常量替换,查询将立即返回。例如:

    选择min(key_part2.),最大限度(key_part2.)tbl_name.在哪里key_part1.= 10;
  • 如果在可用索引的最左侧前缀上进行排序或分组,则对表进行排序或组(例如,命令key_part1.,key_part2.)。如果所有关键部件都接着DESC,键以相反的顺序读取。(或者,如果索引是降索,则键将以前向顺序读取。)见第8.2.1.16节,“ORDER BY Optimization”,第8.2.1.17节“通过优化组”, 和第8.3.13节“降序指数”

  • 在某些情况下,可以优化查询以在不咨询数据行的情况下检索值。(为查询提供所有必要的结果的索引称为a覆盖索引。)如果仅从某些索引中包含的表中包含的列中包含的列,则可以从索引树中检索所选值以获得更大的速度:

    选择key_part3.tbl_name.在哪里key_part1.= 1

对小表的查询或大表的索引对大多数或所有行进行了大表来说。当查询需要访问大部分行时,读数比通过索引更快地读取。顺序读取最小化磁盘试图,即使不需要所有行都需要查询。看第8.2.1.23节,“避免全表扫描”获取详细信息。