8.3.5-单列索引

大部分普通类型的索引都自涉及一个列,在一个数据结构上存储着来自这个列的值,从而可以允许使用相关列值进行快速查找记录。B-tree数据结构使得索引可以快速的查找一个特定值,一个值的集合,或者是一个范围(这要看where条件中相关的操作符是什么,比如=,>,<=,between,in 等等)。每张表的索引数量和每条索引记录的最大长度由存储引擎定义。详情见章节15 InnoDB存储引擎 ,和章节16,其它存储引擎。所有存储引擎都支持每张表至少16个索引,索引总长度至少是256字节。大多数存储引擎的上限值更高。

想了解更多关于单列索引的信息,请查阅章节13.1.15 “CREATE INDEX Statement”。

  • 索引前缀
  • 全文索引
  • 空间索引
  • MEMORY存储引擎中的索引

索引前缀 #

在定义某个列上的索引时,使用col_name(N)语法,你可以创建一个只只使用这一列的前N个字符的索引。只在某列的前缀上建立索引可以让索引文件更小。当你在一个BLOB或一个TEXT类型上建立索引时,你一定要指定前缀长度。例如:

create table test(blob_col BLOB,index(blob_col(10)));

对于行格式是REDUNDANT或COMPACT类型的InnoDB表来说,前缀最长可以达到767字节。如果是行格式是DYNAMI或COMPRESSED,则前缀长度上限是3072字节。对于MyISAM表,索引前缀长度限制是1000字节。 前缀长度限制是以字节来度量的。在CREATE TABLE,ALTER TABLE,和CREATE INDEX语句中,对于nonbinary字符串类型(CHAR,VARCHAR,TEXT),前缀长度是用字符数来度量,而在binary字符串类型(BINARY,VARBINARY,BLOB)中,是用字节来度量。在为一个nonbinary字符串列创建索引时,要考虑这一点。

如果一个搜索条件超过了索引前缀长度,这个索引会被用来排除不匹配的行,剩余的记录仍会被检查,判断是否匹配。

想了解更多关于索引前缀的信息,请查阅章节13.1.15 “CREATE INDEX Statement”。

全文索引 #

全文索引被用于全文搜索。只有InnoDB引擎和MyISAM引擎支持全文索引,并且只支持CHAR,VARCHAR,和TEXT类型的列。索引是针对整个列,不支持前缀。想了解更多细节,请查阅章节12.10,“Full-Text Search Functions”。

在部分针对单张InnoDB表的全文搜索中,MySQL会进行优化。这种类型的搜索特别高效:

  • 只返回document ID或document ID和搜索排行的全文搜索。

  • 对匹配到的记录按分数进行倒序排序,且使用了limit条件,只获取前N条记录的全文搜索。这种优化,只针对没有where条件且只有倒序排序的order by。

  • 返回符合匹配条件的count(*)值,没有其它where条件。where条件类似于 where match(text) against (‘other_text’) ,没有其它比较操作符。

  • 对于包含全文搜索条件的查询,MySQL在优化器阶段进行评估。优化器不仅仅是查看全文搜索表达式并做出评估,实际上会生成一个执行计划。 包含全文搜索的查询比不包含全文搜索的查询,在使用explain进行分析时,会更慢一些,因为后者在优化器阶段不会进行表达式评估。 在对包含全文索引的查询语句进行explain时,Extra列可能会显示Select tables optimized away。在这种场景下,在下面的执行阶段不需要访问表(??)。

空间索引 #

你可以在空间数据类型上创建索引。MyISAM和InnoDB支持在空间数据类型上创建R-tree索引。其它搜索引擎则使用B-trees(除了ARCHIVE,它不支持空间类型索引)。

MEMORY存储引擎的索引 #

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