> For the complete documentation index, see [llms.txt](https://yanghaiji.gitbook.io/advanced-books/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yanghaiji.gitbook.io/advanced-books/note/mysql/book/suo-yin-you-hua-5/lie-suo-yin.md).

# 5.4 列索引

索引的最常见类型涉及单个列，该列将来自该列的值的副本存储在数据结构中，从而允许快速查找具有相应列值的行。 B树数据结构可以让索引快速查找特定值，一组值，或值的范围，对应于运营商， 如=， >，≤， BETWEEN，IN，等等，一在WHERE子句。

每个存储引擎定义每个表的最大索引数和最大索引长度。所有存储引擎每个表至少支持16个索引， 并且总索引长度至少为256个字节。大多数存储引擎都有更高的限制。

## 索引前缀

使用 字符串列的索引规范中的语法，您可以创建仅使用列首字符的索引 。以这种方式仅索引列值的前缀可以使索引文件小得多。为a 或 column 编制索引时 ， 必须为索引指定前缀长度。例如： col\_name(N)NBLOBTEXT

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）。为使用多字节字符集的非二进制字符串列指定前缀长度时，请考虑到这一点。

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

## 全文索引

FULLTEXT索引用于全文搜索。只有InnoDB和 MyISAM存储引擎支持 FULLTEXT索引和仅适用于 CHAR， VARCHAR和 TEXT列。索引始终在整个列上进行，并且不支持列前缀索引。

优化适用于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列中；在这种情况下，以后执行期间无需进行表访问。

## 空间指数

您可以在空间数据类型上创建索引。 MyISAM并InnoDB 支持有关空间类型的R树索引。其他存储引擎使用B树来索引空间类型（除外 ARCHIVE，不支持空间类型索引）。

MEMORY存储引擎中的索引 该MEMORY存储引擎使用 HASH默认的索引，而且还支持 BTREE索引。
