Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Column Indexes

10.3.5 列索引

最常见的索引类型涉及单个列,存储该列的值副本在数据结构中,允许快速查找具有相应列值的行。B-tree 数据结构让索引快速找到特定值、值集或值范围,相应于操作符,如 =>BETWEENIN 等,在 WHERE 子句中。

每个表的最大索引数和最大索引长度是根据存储引擎定义的。请参阅 第 17 章 InnoDB 存储引擎第 18 章 替代存储引擎。所有存储引擎至少支持每个表 16 个索引和总索引长度至少 256 字节。大多数存储引擎具有更高的限制。

有关列索引的更多信息,请参阅 第 15.1.15 节,“CREATE INDEX 语句”

索引前缀

使用 col_name(N) 语法在字符串列的索引规范中,您可以创建一个仅使用该列的前 N 个字符的索引。以这种方式索引列值的前缀可以使索引文件变得非常小。当您索引 BLOBTEXT 列时,您 必须 指定索引的前缀长度。例如:

CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));

前缀可以长达767字节对于使用InnoDB表的REDUNDANTCOMPACT行格式。对于使用InnoDB表的DYNAMICCOMPRESSED行格式,前缀长度限制为3072字节。对于MyISAM表,前缀长度限制为1000字节。

Note

前缀限制以字节为单位,而在CREATE TABLEALTER TABLECREATE INDEX语句中指定的前缀长度是以字符数为单位的非二进制字符串类型(CHARVARCHARTEXT)和以字节为单位的二进制字符串类型(BINARYVARBINARYBLOB)。在指定非二进制字符串列的前缀长度时,请注意这一点。

如果搜索词超过索引前缀长度,则使用索引排除不匹配的行,并检查剩余行以查找可能的匹配项。

有关索引前缀的更多信息,请参阅第15.1.15节,“CREATE INDEX语句”

FULLTEXT索引

全文本 索引用于全文本搜索。只有 InnoDBMyISAM 存储引擎支持 全文本 索引,并且只支持 CHARVARCHARTEXT 列。索引总是整个列的,并且不支持列前缀索引。有关详细信息,请参阅 第 14.9 节,“全文本搜索函数”

对某些种类的 全文本 查询进行了优化,这些查询针对单个 InnoDB 表。具有以下特征的查询特别高效:

  • 全文本 查询,只返回文档 ID 或文档 ID 和搜索排名。

  • 全文本 查询,以降序对匹配行进行排序,并应用 LIMIT 子句以获取前 N 个匹配行。为了应用此优化,必须没有 WHERE 子句,只有一个 ORDER BY 子句,以降序排列。

  • 全文本 查询,只检索匹配行的 COUNT(*) 值,无其他 WHERE 子句。编写 WHERE 子句为 WHERE MATCH(文本) AGAINST ('其他文本'),不带有任何 > 0 比较运算符。

对于包含全文表达式的查询,MySQL 在查询执行的优化阶段评估这些表达式。优化器不仅仅查看全文表达式并进行估算,而是在生成执行计划的过程中实际评估它们。

这种行为的一个推论是,EXPLAIN 对于全文查询通常比非全文查询慢,因为在优化阶段需要评估表达式。

EXPLAIN 对于全文查询可能在 Extra 列中显示 Select tables optimized away,因为在优化阶段已经进行了匹配;在这种情况下,不需要在后续执行中访问表。

空间索引

您可以在空间数据类型上创建索引。MyISAMInnoDB 支持空间类型的 R-tree 索引。其他存储引擎使用 B 树来索引空间类型(除了 ARCHIVE,它不支持空间类型索引)。

MEMORY 存储引擎中的索引

MEMORY 存储引擎默认使用 HASH 索引,但也支持 BTREE 索引。