最常见的索引类型涉及单列,将来自该列的值的副本存储在数据结构中,允许快速查找具有相应列值的行。B-tree 数据结构让索引可以快速找到一个特定的值、一组值或一个值范围,对应于子句
中的=
,
>
, ≤
,
BETWEEN
,等运算符。IN
WHERE
每个表的最大索引数和最大索引长度由每个存储引擎定义。请参阅 第 14 章,InnoDB 存储引擎和 第 15 章,替代存储引擎。所有存储引擎都支持每个表至少有 16 个索引,总索引长度至少为 256 字节。大多数存储引擎都有更高的限制。
有关列索引的其他信息,请参阅 第 13.1.14 节,“CREATE INDEX 语句”。
使用
字符串列的索引规范中的语法,您可以创建仅使用
该列的第一个字符的索引。以这种方式仅索引列值的前缀可以使索引文件小得多。索引
或
列时,
必须为索引指定前缀长度。例如:
col_name
(N
)N
BLOB
TEXT
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
前缀最长可达 1000 字节(
InnoDB
表为 767 字节,除非您已
innodb_large_prefix
设置)。
前缀限制以字节为单位,而 、 和 语句中的前缀长度CREATE TABLE
被
ALTER TABLE
解释
CREATE INDEX
为非二进制字符串类型( 、 、 )的字符数和二进制字符串类型( 、
、
CHAR
)
VARCHAR
的
TEXT
字节数。在为使用多字节字符集的非二进制字符串列指定前缀长度时,请考虑这一点。
BINARY
VARBINARY
BLOB
如果搜索词超过索引前缀长度,则索引用于排除不匹配的行,并检查剩余的行以查找可能的匹配项。
有关索引前缀的其他信息,请参阅 第 13.1.14 节,“CREATE INDEX 语句”。
FULLTEXT
索引用于全文搜索。只有InnoDB
和
MyISAM
存储引擎支持
FULLTEXT
索引,并且仅
支持CHAR
、
VARCHAR
和
TEXT
列。索引总是在整个列上进行,并且不支持列前缀索引。有关详细信息,请参阅
第 12.10 节,“全文搜索功能”。
优化适用于
FULLTEXT
针对单个
InnoDB
表的某些类型的查询。具有这些特征的查询特别有效:
FULLTEXT
只返回文档 ID 或文档 ID 和搜索排名的查询。FULLTEXT
查询按分数的降序对匹配行进行排序,并应用一个LIMIT
子句来获取前 N 个匹配行。要应用此优化,必须没有WHERE
子句,并且只能有一个ORDER BY
降序排列的子句。FULLTEXT
只检索COUNT(*)
与搜索词匹配的行的值的查询,没有附加WHERE
子句。WHERE
将子句 编码为,不带任何比较运算符。WHERE MATCH(
text
) AGAINST ('other_text
')> 0
For queries that contain full-text expressions, MySQL evaluates those expressions during the optimization phase of query execution. The optimizer does not just look at full-text expressions and make estimates, it actually evaluates them in the process of developing an execution plan.
An implication of this behavior is that
EXPLAIN
for full-text queries
is typically slower than for non-full-text queries for which
no expression evaluation occurs during the optimization phase.
EXPLAIN
for full-text queries
may show Select tables optimized away
in
the Extra
column due to matching occurring
during optimization; in this case, no table access need occur
during later execution.