1、索引的分类

1.1 数据结构

B+树索引:InnoDB和MyISAM都默认用,多层平衡树结构,叶子节点用链表串起来,既能快速定位单条记录,又能高效做范围扫描。

哈希索引:Memory引擎默认,通过哈希函数直接计算出数据位置,不支持范围查询和排序。

全文索引:把文本分词后建倒排索引,类似搜索引擎的原理。

空间索引:基于R树实现,专门处理地理坐标这种多维数据,支持区域查询、距离计算。

1.2 InnoDB的存储方式

聚簇索引:就是主键索引,叶子节点存储完整的行数据,数据按主键索引顺序物理存储。

非聚簇索引:又叫二级索引,叶子节点只存储索引字段值和主键值。查询非索引字段时,还需要根据主键值去聚簇索引获取数据。

1.3 索引性质

主键索引:值唯一且非空,一张表只能有一个主键索引,InnoDB中的聚簇索引就是主键索引。

唯一索引:值唯一,但允许null存在,可以有多个null。

普通索引:对值没有约束。

联合索引:多条列组合成一个索引,遵循最左前缀匹配原则。

全文索引:文本搜索用。

空间索引:GIS数据用。

2、索引的创建与失效场景

2.1 创建索引

索引一般在表创建时就一同创建出来,所以这里仅写了建表时的创建语法,且这里的表结构仅为创建索引的演示,在实际设计表时不做参考。

create table user_info(
	id int primary key auto_increment,#主键索引
	username varchar(20) not null,
	password varchar(20) not null,
    article varchar(20) not null,
    location POINT NOT NULL,
    index index02(password),#普通索引
    unique index index01(username),#唯一索引
    index index03(username,password),#联合索引
    fulltext index index04(article),#全文索引
    SPATIAL INDEX index05(location)#空间索引
);

2.2 索引的失效场景

  1. where条件进行了函数套用。
  2. like的%放在了左边,如 '%匹配词' 。
  3. where条件进行了算数运算。
  4. or的前后只有一个走索引。
  5. str时varchar类型,条件为str = 1,发生隐式转换。
  6. 在联合索引中,对某一列进行>、<的范围查询,该列后就不会走索引了。
  7. 联合索引没有走最左匹配原则。

最左前缀匹配原则:联合索引在创建时的顺序,如果是(a,b,c),那在查询时也要按照这个顺序,如:where a = 1 and b = 3 and c = 3 。不能越过a或b列,否则就走不了索引。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐