MySQL 中的索引
索引用来加速查询。正常来说,当查询数据时,MySQL 需要从表的第一条记录开始,读取整个表的内容,进行查询。 但如果有索引,MySQL 可根据索引快速定位需要查询条目的具体位置,加快了查询速度。 原理索引的原理是将被索引列的值,单独取出来存到另一种结构中以获取快速查询的效果。 当列有这些属性中任意一个时,会被索引, 大部分索引以 B-trees 结构存储。但有些例外:
MySQL 使用索引的场景以下场景将借助或依赖于索引:
索引并不是万能的,对于数据量小的表以及对于那些查询全部数据的操作,索引的效果并不明显。相反,对于那些查询时涉及到表中大部分数据的情况下,逐条查询比使用索引要快。 索引的类型主要有以下四种索引类型,关于创建索引的其他详情可参见 MySQL Manual - 13.1.15 CREATE INDEX Syntax。
Index Prefixes对于字符串类型的列,在索引创建语法中指定 CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10))); 查询时,如果查询项超过了索引长度,索引将用来排除掉那些在索引长度范围内匹配失败的记录,剩下的记录则正常查询。 FULLTEXT 索引全文本索引用于全文本(full-text)的搜索。只 InnoDB 和 MyISAM 两种引擎下的 CHAR,VARCHAR,TEXT 数据类型支持全文本索引。不像 Index Prefixes,该类型的索引是会对整列的。 Spatial 索引Spatial Data 数据类型 上创建的索引。 MEMORY Storage Engine 中的索引MEMORY 存储引擎默认使用 HASH 索引,但也支持 BTREE 索引。 索引的创建索引可在创建表时创建,参考 13.1.20 CREATE TABLE Syntax,也可针对已有的表进行创建,使用 CREATE INDEX 语句。 创建索引的语法CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
[index_type]
ON tbl_name (key_part,...)
[index_option]
[algorithm_option | lock_option] ...
有如下类型的索引指定方式,
以列前缀的方可用于创建列中指定前缀部分 示例: CREATE INDEX part_of_name ON customer (name(10)); 以上语句对名为 函数形式普通形式的索引只能索引列中的值,比如: CREATE TABLE t1 (
col1 VARCHAR(10),
col2 VARCHAR(20),
INDEX (col1, col2(10))
); 以上语句对 但使用函数形式,可创建针对表达式的索引,而不是表中的列。 CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC); 函数形式的索引在定义时需要满足以下的条件,否则抛错:
/* 🚨 */
INDEX (col1 + col2, col3 - col4)
/* 🚨 */
INDEX ((col1), (col2))
Unique 索引指定为 如果一个表拥有
Full-Text 索引详细的操作参见 12.9.7 Adding a Collation for Full-Text Indexing。 Spatial 索引不同存储引擎对其支持情况不一,详见 Spatial Indexes。 相关资源 |