最常见的索引类型是单列索引,它将该列的值的副本存储在一个数据结构中,允许快速查找具有相应列值的记录。B 树数据结构允许索引快速查找特定值、一组值或值的范围,对应于 =
、>
、≤
、BETWEEN
、IN
等运算符在 WHERE
子句中。
每个表的最大索引数和最大索引长度由每个存储引擎定义。请参阅 第 17 章 InnoDB 存储引擎 和 第 18 章 替代存储引擎。所有存储引擎都支持每个表至少 16 个索引,总索引长度至少为 256 个字节。大多数存储引擎都有更高的限制。
有关列索引的其他信息,请参阅 第 15.1.15 节,“CREATE INDEX 语句”。
使用字符串列的索引规范中的
语法,可以创建一个仅使用该列的前 col_name
(N
)N
个字符的索引。以这种方式仅索引列值的前缀可以使索引文件小得多。为 BLOB
或 TEXT
列创建索引时,必须 为索引指定前缀长度。例如:
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
对于使用 REDUNDANT
或 COMPACT
行格式的 InnoDB
表,前缀最多可以包含 767 个字节。对于使用 DYNAMIC
或 COMPRESSED
行格式的 InnoDB
表,前缀长度限制为 3072 个字节。对于 MyISAM 表,前缀长度限制为 1000 个字节。
前缀限制以字节为单位,而 CREATE TABLE
、ALTER TABLE
和 CREATE INDEX
语句中的前缀长度解释为非二进制字符串类型(CHAR
、VARCHAR
、TEXT
)的字符数和二进制字符串类型(BINARY
、VARBINARY
、BLOB
)的字节数。为使用多字节字符集的非二进制字符串列指定前缀长度时,请考虑到这一点。
如果搜索词超过索引前缀长度,则使用索引排除不匹配的记录,并检查剩余的记录以查找可能的匹配项。
有关索引前缀的其他信息,请参阅 第 15.1.15 节,“CREATE INDEX 语句”。
FULLTEXT
索引用于全文搜索。只有 InnoDB
和 MyISAM
存储引擎支持 FULLTEXT
索引,并且仅支持 CHAR
、VARCHAR
和 TEXT
列。索引始终针对整个列进行,不支持列前缀索引。有关详细信息,请参见 第 14.9 节“全文搜索函数”。
针对单个 InnoDB
表的某些类型的 FULLTEXT
查询会应用优化。具有以下特征的查询效率特别高:
仅返回文档 ID 或文档 ID 和搜索排名的
FULLTEXT
查询。按分数降序对匹配行进行排序并应用
LIMIT
子句以获取前 N 个匹配行的FULLTEXT
查询。要应用此优化,必须没有WHERE
子句,并且只有一个按降序排列的ORDER BY
子句。仅检索与搜索词匹配的行数的
COUNT(*)
值,且没有其他WHERE
子句的FULLTEXT
查询。将WHERE
子句编码为WHERE MATCH(
,不带任何text
) AGAINST ('other_text
')> 0
比较运算符。
对于包含全文表达式的查询,MySQL 会在查询执行的优化阶段评估这些表达式。优化器不仅会查看全文表达式并进行估计,还会在制定执行计划的过程中实际评估它们。
这种行为的一个含义是,对于全文查询,EXPLAIN
通常比非全文查询慢,因为非全文查询在优化阶段不会进行表达式评估。
由于在优化期间进行匹配,因此全文查询的 EXPLAIN
可能会在 Extra
列中显示 Select tables optimized away
;在这种情况下,在以后的执行过程中不需要访问表。