最常见的索引类型涉及一列,将该列的值的副本存储在数据结构中,允许快速查找具有相应列值的行。B树数据结构允许索引在WHERE子句中快速找到与=、>、≤、BETWEEN、IN等运算符对应的特定值、一组值或一系列值。
每个表的最大索引数和最大索引长度由每个存储引擎定义。请参阅第14章“InnoDB存储引擎”和第15章“替代存储引擎”。所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节。大多数存储引擎都有更高的限制。
Index Prefixes
使用字符串列的索引规范中的col_name(N)语法,您可以创建仅使用列的前N个字符的索引。以这种方式仅对列值的前缀进行索引可以使索引文件小得多。为BLOB或TEXT列建立索引时,必须为索引指定前缀长度。例如:
前缀的长度最多为1000字节(InnoDB表为767字节,除非您设置了InnoDB_blarge_prefix)
Note
Prefix limits are measured in bytes, whereas the prefix length in CREATE TABLE, ALTER TABLE, and CREATE INDEX statements is interpreted as number of characters for nonbinary string types (CHAR, VARCHAR, TEXT) and number of bytes for binary string types (BINARY, VARBINARY, BLOB). Take this into account when specifying a prefix length for a nonbinary string column that uses a multibyte character set.
如果搜索词超过索引前缀长度,则使用索引排除不匹配的行,并检查其余行是否可能匹配。
有关索引前缀的更多信息
FULLTEXT Indexes
FULLTEXT索引用于全文搜索。只有InnoDB和MyISAM存储引擎支持FULLTEXT索引,并且仅支持CHAR、VARCHAR和TEXT列。索引始终在整个列上进行,不支持列前缀索引。有关详细信息,请参阅第12.9节“全文搜索功能”。
优化应用于针对单个InnoDB表的某些类型的FULLTEXT查询。具有这些特征的查询特别有效:
仅返回文档ID或文档ID和搜索排名的FULLTEXT查询。
FULLTEXT查询按分数降序对匹配行进行排序,并应用LIMIT子句获取前N个匹配行。为了应用此优化,必须没有WHERE子句,只有一个降序排列的ORDER BY子句。
仅检索与搜索词匹配的行的COUNT(*)值的FULLTEXT查询,没有其他WHERE子句。将WHERE子句编码为WHERE MATCH(text)AGAINST('other_text'),不使用任何大于0的比较运算符。
对于包含全文表达式的查询,MySQL会在查询执行的优化阶段计算这些表达式。优化器不仅查看全文表达式并进行估计,它实际上还在制定执行计划的过程中对其进行评估。
这种行为的一个含义是,全文查询的EXPLAIN通常比在优化阶段没有进行表达式计算的非全文查询慢。
全文查询的EXPLAIN可能会在Extra列中显示Select表已优化,因为在优化过程中发生了匹配;在这种情况下,在以后的执行过程中不需要对表进行访问。
Spatial Indexes
您可以对空间数据类型创建索引。MyISAM和InnoDB支持空间类型的R树索引。其他存储引擎使用B树对空间类型进行索引(ARCHIVE除外,它不支持空间类型索引)。
Indexes in the MEMORY Storage Engine
默认情况下,MEMORY存储引擎使用HASH索引,但也支持BTREE索引。