索引用于快速查找具有特定列值的行。如果没有索引,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)
不是。对于非二进制字符串列之间的比较,两个列应该使用相同的字符集。例如,比较a
use 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_part1
,key_part2
DESC
,则按相反的顺序读取键。看到第8.2.1.14节,“优化排序”,第8.2.1.15节,“GROUP BY Optimization”.在某些情况下,可以优化查询以在不查询数据行的情况下检索值。为查询提供所有必要结果的索引称为索引覆盖索引)。如果查询只从表中使用某些索引中包含的列,则可以从索引树中检索所选值以获得更快的速度:
选择key_part3从tbl_name在哪里key_part1= 1
对于小表或报表查询处理大部分或所有行的大表的查询,索引不那么重要。当查询需要访问大多数行时,按顺序读取比通过索引操作要快。顺序读取将最小化磁盘寻道,即使查询并不需要所有行。看到第8.2.1.20节“避免全表扫描”获取详细信息。