列索引
索引的最常见类型涉及单个列,该列将来自该列的值的副本存储在数据结构中,从而允许快速查找具有相应列值的行。B树数据结构可以让索引快速查找特定值,一组值,或值的范围,对应于运营商,如=
,>
,≤
,BETWEEN
,IN
,等等,一在WHERE
子句。
每个存储引擎定义每个表的最大索引数和最大索引长度。请参阅InnoDB存储引擎和备用存储引擎。所有存储引擎每个表至少支持16个索引,并且总索引长度至少为256个字节。大多数存储引擎都有更高的限制。
有关列索引的更多信息,请参见“ CREATE INDEX语句”。
- 索引前缀
- 全文索引
- 空间指数
- MEMORY存储引擎中的索引
索引前缀
使用字符串列的索引规范中的语法,您可以创建仅使用列首字符的索引。以这种方式仅索引列值的前缀可以使索引文件小得多。在为a 或 column 编制索引时,必须为索引指定前缀长度。例如:col_name(N)
N
BLOB
TEXT
CREATE TABLE test (blob_col BLOB,INDEX (blob_col(10)));
对于InnoDB
使用REDUNDANT
或COMPACT
行格式的表,前缀的最大长度为767个字节。对于InnoDB
使用DYNAMIC
或COMPRESSED
行格式的表,前缀长度限制为3072字节。对于MyISAM表,前缀长度限制为1000个字节。
注意前缀限制以字节为单位,而在前缀长度
CREATE TABLE
,ALTER TABLE
和CREATE INDEX
语句被解释为非二进制串类型的字符数(CHAR
,VARCHAR
,TEXT
对于二进制串类型),并且字节数(BINARY
,VARBINARY
,BLOB
)。为使用多字节字符集的非二进制字符串列指定前缀长度时,请考虑到这一点。
如果搜索词超过索引前缀长度,则使用索引排除不匹配的行,然后检查其余行是否可能匹配。
有关索引前缀的更多信息,请参见“ CREATE INDEX语句”。
全文索引
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
,因此全文查询可能会显示在该Extr
列中;在这种情况下,以后执行期间无需进行表访问。
空间指数
您可以在空间数据类型上创建索引。MyISAM
并InnoDB
支持有关空间类型的R树索引。其他存储引擎使用B树来索引空间类型(除外ARCHIVE
,不支持空间类型索引)。
MEMORY存储引擎中的索引
该MEMORY
存储引擎使用HASH
默认的索引,而且还支持BTREE
索引。