一、索引

在数据库中,对于查询操作比较频繁的表,可以使用索引,索引又分为主键索引和非主键索引(有人也分为聚簇索引和非聚簇索引),我们先来看看主键索引是如何提高查询性能的。

1.1聚簇索引

索引经历了几个阶段,第一个阶段使用的是二叉树,将数据直接存储在各个节点上,虽然相对一般查询来说也提高了效率,但是由于层级太高,查询和维护的时候都比较麻烦;第二阶段是B-数,此时也是将数据存储在各个节点上,虽然提高了维护效率,但是加载全部的信息还是需要不少的时间;第三阶段是B+数,该阶段将索引存储到B+树上,非叶子节点不存储数据,叶子节点也不存储数据,存储的是数据的地址,这样便大大提高了查询效率。

走索引LEFT JOIN 走索引一定快吗_java

走索引LEFT JOIN 走索引一定快吗_mysql_02


MySQL5.5之后使用的InnoDB引擎实现索引的原理就是B+树,这就是主键索引查询快的原因。

1.2非主键索引

非主键索引查询的时候采用的也是B+树,不同的是叶子节点存储的是主键索引的值,MySQL会根据主键索引又使用主键索引查询方式进行查询。这也叫回表查询。

走索引LEFT JOIN 走索引一定快吗_数据库_03


所以索引查询那么快,我们在对数据进行频繁的查询时一定要使用,但有的操作会直接导致索引时效比如下面:

二、索引时效的场景

2.1 联合索引不满足最左匹配原则

在联合索引中,查询语句必须要以联合索引最左边的字段开始进行查询,不满足该条件则索引会失效。
比如使用联合查询(A,B,C),符合最左匹配原则的为:

  • A+B+C
  • A+B
  • A+C
  • A
    不符合最左匹配原则的为:
  • B
  • C
  • B+C
  • C+B

2.2使用错误的模糊查询

比如查询姓名为"张小三"的信息,正确使用方式为:

  • 字段名 like 张%
    索引失效的查询为:
  • 字段名 like %三
  • 字段名 like %小%

2.3 使用列运算操作

查询时使用(±*/)操作都会使索引失效

2.4 对列使用了函数

2.5使用了 is not null

2.6查询的列使用了隐式转换

走索引LEFT JOIN 走索引一定快吗_mysql_04