java面试一日一题:讲下mysql中的索引

问题:请讲下mysql中的索引

分析:mysql中有很多索引,要对对这些索引有所掌握,还要弄清楚每种索引的本质?

回答要点:

主要从以下几点去考虑

1、索引的本质是什么

2、mysql的索引分类;

3、每种分类的依据;

 

mysql在日常的开发中使用非常广泛,经常会提到的一句是在进行优化的时候,要对索引进行优化,那么到达什么是索引那。

索引其实是一种数据结构,建立索引的目的是为了提高查询效率。如果没有索引那么存储在磁盘中的数据(mysql中的数据归根结底是存储在磁盘中的),就需要扫描磁盘,把磁盘中的数据挨个扫描并进行比较,判断是否为需要的数据,为了提高查询的效率,增加一个索引的数据结构,在查找数据的时候先通过读取索引,找到要查找数据的主键或数据地址,然后根据找到的主键或数据地址去硬盘定位数据,这样比直接扫描磁盘要快很多。

mysql中,myIsam和nnodb两种数据引擎,底层的索引结构都是B+树。

从数据和索引是否在一起可以分为聚集索引和非聚集索引。

聚集索引

聚集索引,索引记录和数据存储在一起,inndob引擎下的主键索引便是聚集索引,其索引树的叶子节点存储的是主键和对应的行记录

非聚集索引

非聚集索引,当时是索引记录和数据是分开存储的,myIsam引擎下的索引都是非聚集索引,其索引树的叶子节点存储的是索引列和对应数据行的地址;要查询数据首先通过索引树找到对应的数据地址,然后根据地址进行查询;

innodb下的非主键索引不严格意义上来说也可以算作非聚集索引,因为非主键索引的叶子节点存储的是索引列和主键值,这里的主键值可以看作是数据地址;

从索引列是否为主键可以分为主键索引和普通索引

主键索引

主键索引,以主键建立的索引树,在inndob下必须要有主键索引,也就是必须要有主键,在建表时最好设置主键,在不设置主键的情况下,mysql会选择一个唯一性的列作为主键,如果没有唯一列则会默认生成一个自增的row_id作为主键,也就是说inndob的表肯定有主键索引,因为主键索引的叶子节点存储的是对应的行记录且仅有一份,没有主键索引就没有数据。

普通索引

普通索引,非主键的索引都叫普通索引,可以分为单列索引和联合索引(多列索引),单列索引就是一个列建立的索引;联合索引就是多个列组成的索引,联合索引就涉及索引的最左匹配原则。普通索引的叶子节点存储的是索引列和对应的主键值。在命中普通索引的情况下,找到主键值后,需要根据主键值再查找主键索引方可查询到对应的数据,而命中主键索引时则可以直接查找到数据,所以主键索引查询效率一般较高。

 

上面说到了索引的分类及优点,最大的优点就是提高查询效率,但也不是索引越多越好,因为索引作为一种数据结构也是要占磁盘空间的,在更新、插入、删除数据的同时也要维护索引结构会耗费时间,不能为了提高查询效率而牺牲更新操作的效率,需要合理的设置每张表的索引数量,一般5–6个为最好。

Tags: