索引用于快速查找具有特定列值的行。如果没有索引,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可以更有效地使用列上的索引。在这种背景下,
VARCHAR
和char
如果被声明为相同的大小,则被认为是相同的。例如,VARCHAR (10)
和Char(10)
是一样的尺寸,但是VARCHAR (10)
和Char(15)
不是。对于非边界字符串列之间的比较,这两个列应使用相同的字符集。例如,比较a
UTF8.
柱子用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节,“避免全表扫描”获取详细信息。