10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国Ltr)- 36.3 mb
PDF (A4)- 36.3 mb
手册(TGZ)- 235.4 kb
手册(Zip)- 347.1 kb
信息(Gzip)- 3.3 mb
信息(邮政编码)- 3.3 mb
本手册节选

8.3.1 MySQL如何使用索引

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

大多数MySQL索引(主键独特的指数,全文)储存在b树.例外:空间数据类型的索引使用r -树;内存表也支持散列索引InnoDB使用倒排表全文索引。

通常,索引的使用方法如下面的讨论所述。特定于哈希索引的特征(如在内存表)的描述第8.3.8节“b -树和哈希索引的比较”

MySQL使用索引进行以下操作:

  • 找到匹配a的行在哪里条款很快。

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

  • 如果表具有多列索引,则优化器可以使用索引最左边的任何前缀查找行。例如,如果在上有一个三列索引(col1, col2, col3),您已启用索引搜索功能(col1)(col1 col2),(col1, col2, col3).有关更多信息,请参见第8.3.5节,“多列索引”

  • 在执行联接时从其他表检索行。如果将列声明为相同的类型和大小,MySQL可以更有效地在列上使用索引。在这种情况下,VARCHAR而且字符如果它们被声明为相同的大小,则认为是相同的。例如,VARCHAR (10)而且CHAR (10)都是一样的尺寸,但是VARCHAR (10)而且CHAR (15)不是。

    对于非二进制字符串列之间的比较,两个列应该使用相同的字符集。例如,比较ause utf8的列latin1列排除了索引的使用。

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

  • 要找到MIN ()MAX ()值的值key_col.这是通过预处理器来优化的,它会检查你是否在使用在哪里key_part_N常数之前发生过的所有关键部分key_col在索引中。在本例中,MySQL为每个键执行一个键查找MIN ()MAX ()表达式并将其替换为常量。如果所有表达式都替换为常量,则查询立即返回。例如:

    选择最小值(key_part2)、马克斯(key_part2)tbl_name在哪里key_part1= 10;
  • 对表进行排序或分组,如果排序或分组是在可用索引的最左前缀上进行的(例如,命令key_part1key_part2).如果所有关键部分后面都是DESC,则按相反的顺序读取键。看到第8.2.1.14节,“优化排序”,第8.2.1.15节,“GROUP BY Optimization”

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

    选择key_part3tbl_name在哪里key_part1= 1

对于小表或报表查询处理大部分或所有行的大表的查询,索引不那么重要。当查询需要访问大多数行时,按顺序读取比通过索引操作要快。顺序读取将最小化磁盘寻道,即使查询并不需要所有行。看到第8.2.1.20节“避免全表扫描”获取详细信息。