Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Column Indexes

10.3.5 列索引

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

每个存储引擎都定义了表的最大索引数和最大索引长度。见第17章,InnoDB 存储引擎,和第18章,Alternative 存储引擎。所有存储引擎都支持至少16个索引表和总索引长度至少256字节。多数存储引擎的限制更高。

关于列索引的更多信息,见第15.1.15节,“CREATE INDEX 语句”.

在字符串列的索引指定中,使用col_name(N)语法,可以创建只使用列的前N个字符的索引。这样索引文件可以变得很小。当你对BLOBTEXT列创建索引时,你必须指定索引的前缀长度,例如:

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

前缀可以长达767字节,对于使用冗余行格式紧凑行格式的InnoDB表。前缀长度限制为3072字节,对于使用动态行格式压缩行格式的InnoDB表。对于MyISAM表,前缀长度限制为1000字节。

Note

前缀限制以字节为单位,而在CREATE TABLEALTER TABLECREATE INDEX语句中,prefix 长度对非二进制字符串类型(CHARVARCHARTEXT)解释为字符数,对二进制字符串类型(BINARYVARBINARYBLOB)解释为字节数。在指定非二进制字符串列的前缀长度时,需要考虑使用多字节字符集。

如果搜索词语超过索引前缀长度,索引将用于排除不匹配行,然后剩余行将被检查以查找可能的匹配项。

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

FULLTEXT 索引

FULLTEXT索引用于全文搜索。只有InnoDBMyISAM存储引擎支持FULLTEXT索引,并且只适用于CHARVARCHARTEXT列。索引总是对整个列进行,前缀索引不支持。详细信息请见第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,因为优化阶段的匹配导致后续执行不需要访问表。

空间索引

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

MEMORY 存储引擎中的索引

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