10.3.5 列索引
最常见的索引类型涉及到单个列,存储该列的值副本在数据结构中,使得快速查找具有相应列值的行。B树数据结构让索引可以快速找到特定的值、一个值集或一个值范围,对于=
、>
、≤
、BETWEEN
、IN
等操作符在 WHERE
子句中。
每个存储引擎都定义了表的最大索引数和最大索引长度。见第17章,InnoDB 存储引擎,和第18章,Alternative 存储引擎。所有存储引擎都支持至少16个索引表和总索引长度至少256字节。多数存储引擎的限制更高。
关于列索引的更多信息,见第15.1.15节,“CREATE INDEX 语句”.
在字符串列的索引指定中,使用
语法,可以创建只使用列的前col_name
(N
)N
个字符的索引。这样索引文件可以变得很小。当你对BLOB
或TEXT
列创建索引时,你必须指定索引的前缀长度,例如:
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
前缀可以长达767字节,对于使用冗余行格式或紧凑行格式的InnoDB表。前缀长度限制为3072字节,对于使用动态行格式或压缩行格式的InnoDB表。对于MyISAM表,前缀长度限制为1000字节。
前缀限制以字节为单位,而在CREATE TABLE
、ALTER TABLE
和CREATE INDEX
语句中,prefix 长度对非二进制字符串类型(CHAR
、VARCHAR
、TEXT
)解释为字符数,对二进制字符串类型(BINARY
、VARBINARY
、BLOB
)解释为字节数。在指定非二进制字符串列的前缀长度时,需要考虑使用多字节字符集。
如果搜索词语超过索引前缀长度,索引将用于排除不匹配行,然后剩余行将被检查以查找可能的匹配项。
关于索引前缀的更多信息,请参见第15.1.15节,“CREATE INDEX 语句”。
FULLTEXT 索引
FULLTEXT
索引用于全文搜索。只有InnoDB
和MyISAM
存储引擎支持FULLTEXT
索引,并且只适用于CHAR
、VARCHAR
和TEXT
列。索引总是对整个列进行,前缀索引不支持。详细信息请见第14.9节,“全文搜索函数”。
对某些类型的FULLTEXT
查询进行优化。具有这些特征的查询特别高效:
-
FULLTEXT
查询只返回文档ID,或者文档ID和搜索排名。 -
FULLTEXT
查询对匹配行进行降序排序,并应用LIMIT
子句来取前N个匹配行。为使优化生效,必须没有WHERE
子句,只有一个降序的ORDER BY
子句。 -
FULLTEXT
查询,仅检索匹配搜索词的行数,且不包含额外的WHERE
子句。将WHERE
子句编码为WHERE MATCH(
,不包含任何text
) AGAINST ('other_text
')> 0
比较操作符。
对于包含全文表达式的查询,MySQL 在查询执行优化阶段对这些表达式进行评估。优化器不仅仅查看全文表达式,还实际地对它们进行评估,以开发执行计划过程中。
EXPLAIN
对于全文查询通常比非全文查询慢,因为在优化阶段没有表达式评估发生。
EXPLAIN
对于全文查询可能在 Extra
列中显示 Select tables optimized away
,因为优化阶段的匹配导致后续执行不需要访问表。