### 8.3.5 列索引

[](<>)[](<>)[](<>)

最常见的索引类型涉及单个列，将来自该列的值的副本存储在数据结构中，从而允许快速查找具有相应列值的行。B树数据结构让索引可以快速找到一个特定的值，一组值，或者一个范围的值，对应的操作符如`=`,`>`,`≤`,`之间`,`在`，依此类推，在一个`在哪里`条款。

每个表的最大索引数和最大索引长度由每个存储引擎定义。看[第 15 章，*InnoDB 存储引擎*](innodb-storage-engine.html)， 和[第 16 章，*替代存储引擎*](storage-engines.html).所有存储引擎都支持每个表至少有 16 个索引，总索引长度至少为 256 字节。大多数存储引擎都有更高的限制。

有关列索引的更多信息，请参阅[第 13.1.15 节，“CREATE INDEX 语句”](create-index.html).

-   [索引前缀](column-indexes.html#column-indexes-prefix)

-   [全文索引](column-indexes.html#column-indexes-fulltext)

-   [空间索引](column-indexes.html#column-indexes-spatial)

-   [MEMORY 存储引擎中的索引](column-indexes.html#column-indexes-memory-storage-engine)

#### 索引前缀

[](<>)[](<>)[](<>)[](<>)[](<>)

和`*`col_name`*(*`ñ`*)`字符串列的索引规范中的语法，您可以创建仅使用第一个索引的索引*`ñ`*列的字符。以这种方式仅索引列值的前缀可以使索引文件更小。当你索引一个[`斑点`](blob.html)要么[`文本`](blob.html)专栏，你*必须*指定索引的前缀长度。例如：

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

前缀最长可达 767 个字节`InnoDB`使用的表`[冗余](glossary.html#glos_redundant_row_format)`要么`[紧凑](glossary.html#glos_compact_row_format)`行格式。前缀长度限制为 3072 字节`InnoDB`使用的表`[动态](glossary.html#glos_dynamic_row_format)`要么`[压缩](glossary.html#glos_compressed_row_format)`行格式。对于 MyISAM 表，前缀长度限制为 1000 字节。

笔记

前缀限制以字节为单位，而前缀长度以字节为单位[`创建表`](create-table.html),[`更改表`](alter-table.html)， 和[`创建索引`](create-index.html)语句被解释为非二进制字符串类型的字符数 ([`字符`](char.html),[`VARCHAR`](char.html),[`文本`](blob.html)) 和二进制字符串类型的字节数 ([`二进制`](binary-varbinary.html),[`变量`](binary-varbinary.html),[`斑点`](blob.html)）。在为使用多字节字符集的非二进制字符串列指定前缀长度时，请考虑到这一点。

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

有关索引前缀的更多信息，请参阅[第 13.1.15 节，“CREATE INDEX 语句”](create-index.html).

#### 全文索引

[](<>)[](<>)

`全文`索引用于全文搜索。只有[`InnoDB`](innodb-storage-engine.html)和[`MyISAM`](myisam-storage-engine.html)存储引擎支持`全文`索引并且仅用于[`字符`](char.html),[`VARCHAR`](char.html)， 和[`文本`](blob.html)列。索引始终在整个列上进行，并且不支持列前缀索引。有关详细信息，请参阅[第 12.10 节，“全文搜索功能”](fulltext-search.html).

优化适用于某些类型`全文`查询单`InnoDB`表。具有这些特征的查询特别有效：

-   `全文`仅返回文档 ID 或文档 ID 和搜索排名的查询。

-   `全文`按分数降序对匹配行进行排序并应用`限制`子句获取前 N 个匹配行。要应用此优化，必须没有`在哪里`子句并且只有一个`订购方式`子句按降序排列。

-   `全文`只检索`数数（*）`匹配搜索词的行的值，没有额外的`在哪里`条款。编码`在哪里`子句作为`在哪里匹配（*`文本`*） 反对 （'*`其他文本`*')`, 没有任何`> 0`比较运算符。

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

    这种行为的一个含义是[`解释`](explain.html)对于全文查询，通常比在优化阶段不进行表达式评估的非全文查询慢。

[`解释`](explain.html)全文查询可能会显示`选择优化掉的表`在里面`额外的`由于在优化期间发生匹配而导致的列；在这种情况下，在以后的执行过程中不需要访问表。

#### 空间索引

[](<>)[](<>)

您可以为空间数据类型创建索引。`MyISAM`和`InnoDB`支持空间类型的 R-tree 索引。其他存储引擎使用 B 树来索引空间类型（除了`档案`，不支持空间类型索引）。

#### MEMORY 存储引擎中的索引

[](<>)[](<>)

这`记忆`存储引擎使用`哈希`默认索引，但也支持`BTREE`索引。
