Documentation Home
MySQL 8.0 参考手册  / 第8章优化  / 8.3 优化和索引  /  8.3.5 列索引

8.3.5 列索引

最常见的索引类型涉及单列,将来自该列的值的副本存储在数据结构中,允许快速查找具有相应列值的行。B-tree 数据结构让索引可以快速找到一个特定的值、一组值或一个值范围,对应于子句 中的=, >, , BETWEEN,等运算符。INWHERE

每个表的最大索引数和最大索引长度由每个存储引擎定义。请参阅 第 15 章,InnoDB 存储引擎第 16 章,替代存储引擎。所有存储引擎都支持每个表至少有 16 个索引,总索引长度至少为 256 字节。大多数存储引擎都有更高的限制。

有关列索引的其他信息,请参阅 第 13.1.15 节,“CREATE INDEX 语句”

索引前缀

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

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

对于使用或 行格式的InnoDB表, 前缀最长可达 767 个字节 。 对于使用or 行格式的表, 前缀长度限制为 3072 字节 。对于 MyISAM 表,前缀长度限制为 1000 字节。 REDUNDANTCOMPACTInnoDBDYNAMICCOMPRESSED

笔记

前缀限制以字节为单位,而 、 和 语句中的前缀长度CREATE TABLEALTER TABLE解释 CREATE INDEX为非二进制字符串类型( 、 、 )的字符数和二进制字符串类型( 、 、 CHARVARCHARTEXT字节数。在为使用多字节字符集的非二进制字符串列指定前缀长度时,请考虑这一点。 BINARYVARBINARYBLOB

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

有关索引前缀的其他信息,请参阅 第 13.1.15 节,“CREATE INDEX 语句”

全文索引

FULLTEXT索引用于全文搜索。只有InnoDBMyISAM存储引擎支持 FULLTEXT索引,并且仅 支持CHARVARCHARTEXT列。索引总是在整个列上进行,并且不支持列前缀索引。有关详细信息,请参阅 第 12.10 节,“全文搜索功能”

优化适用于 FULLTEXT针对单个 InnoDB表的某些类型的查询。具有这些特征的查询特别有效:

  • FULLTEXT只返回文档 ID 或文档 ID 和搜索排名的查询。

  • FULLTEXT查询按分数的降序对匹配行进行排序,并应用一个 LIMIT子句来获取前 N 个匹配行。要应用此优化,必须没有 WHERE子句,并且只能有一个 ORDER BY降序排列的子句。

  • FULLTEXT只检索 COUNT(*)与搜索词匹配的行的值的查询,没有附加WHERE 子句。WHERE将子句 编码为,不带任何比较运算符。 WHERE MATCH(text) AGAINST ('other_text')> 0

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

此行为的含义是, EXPLAIN全文查询通常比非全文查询慢,非全文查询在优化阶段不进行表达式评估。

EXPLAIN由于优化过程中发生的匹配,全文查询可能会显示Select tables optimized away在列中;Extra在这种情况下,在以后的执行过程中不需要进行表访问。

空间索引

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

MEMORY 存储引擎中的索引

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