InnoDB引擎下的MySQL索引
结构默认为B+树,少部分为Hash桶
有聚集索引,非聚集索引之分
加索引后查询效率变快、但是为了维护B+树的稳定,增删改会变慢
主键索引为聚集索引,聚集索引只有一个,索引键值的逻辑顺序和物理顺序一致
聚集索引和非聚集索引之间的关系
非聚集索引和聚集索引一样,采用B+树作为索引,每次给字段建立一条索引,字段中的数据就会被复制出来一份,用于生成新的索引,给表添加太多索引会增加表的体积,占用磁盘存储空间。
非聚集索引和聚集索引的区别在于,聚集索引的B+树叶子结点存储的是所需要查找的数据,而非聚集索引的B+树的叶子结点存储的是该数据行的主键值,查到主键值之后再次通过聚集索引的B+树结构查找所需要的数据,这个操作叫作回表,回表操作的磁盘IO次数必然比不回表多,索引查询效率势必更低一些。 不管以任何方式查询表, 最终都会利用主键通过聚集索引来定位到数据, 聚集索引(主键)是通往真实数据所在的唯一路径。
覆盖索引是非聚集索引之中的特例,覆盖索引的叶子结点存储的就是创建所索引时的关联字段值,所以查到叶子节点的时候,所需要查找的数据也已经出来了,不需要回表操作。 覆盖索引是查询的列可以直接通过索引提取,比如只查询主键的列! 或者查询联合索引的所有列或者左边开始的部分列(注意有顺序的) 而联合索引并不一定只从索引中能获取到所有的数据,这个取决于你所查询的列。
什么时候加索引
(1)列经常被用于where条件中
(2)列中有大量的空值
(3)表几乎没有被修改
(4)数据量很大,只有2-4%的数据被选出来
什么时候索引会失效
(1)对列进行计算或者是使用函数,则该列的索引会失效
(2)不匹配数据类型,会造成索引失效
(3)where语句中使用了IS NULL或者IS NOT NULL,会造成索引失效
(4)使用了反向操作,该索引将不起作用
(5)使用了link操作,索引就将不起作用
(6)在WHERE中使用OR时,有一个列没有索引,那么其它列的索引将不起作用
为什么InnoDB存储引擎索引结构默认是B+树而不是B树?
B+树相对于B树更加矮胖,查询效率稳定,由于所有值都存储在叶子结点,并且叶子结点之间存在双向指针,使得范围查询更容易
为什么默认为B+树而不是Hash桶?
B+树支持范围查询,Hash索引只支持单点查询,在很多业务逻辑中都需要使用到范围查询的情况