1.索引常见模型

1.1哈希表存储结构

优点:新增数据的时候无需排序,速度快,等值查询速度快
缺点:哈希表在做区间查询的时候需要全表扫描,速度慢

1.2有序数组存储结构

优点:等值查询范围查询速度快
缺点:新增数据速度慢

1.3树存储结构

在读写上一定程度上具有上述的优点,现阶段被广泛采用

2.InnoDB的B+树索引模型

2.1聚簇索引(clustered index )与非聚簇索引(secondary index)

聚簇索引:主索引的叶子节点直接存放表的数据,通过主索引查找数据,则按照B+树的检索算法即可查找到对应的叶节点,直接获得行数据。若通过辅助索引进行查找,第一步在辅助索引B+树中检索,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。
非聚簇索引:主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。数据和索引相互独立,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,两个索引之间无关联。

2.2InnoDB的索引

InnoDB的索引分成两种:主键索引和非主键索引,其中主键索引用的是聚簇索引,非主键索引叫做二级索引。当InnoDB中使用非主键索引进行搜索的时候需要先通过非主键的B+查询出主键然后在主键索引上查询具体的值。
以上,非主键索引会存储主键索引的值,所以主键长度越小,非主键索引占据的空间就越小。

3.InnoDB最左前缀原则

3.1回表

通过非主键索引获取的key值在主键索引上查询具体信息的过程叫做回表

3.2覆盖索引

当我们在查询的时候使用select * 的时候需要这条记录的详细信息,而此信息仅在主键索引上存在,所以必须执行回表。但是有的时候我们只想获取主键信息,而非主键索引的叶子节点已经保存主键信息,就不需要执行回表,也就是这个查询里非主键索引已经覆盖了我们的查询需求,我们称之为覆盖索引。
优点:无需执行回表减少搜索次数,提高性能,常用的性能优化手段

3.3最左前缀原则及联合索引

当建立索引或者联合索引的时候InnoDB遵循最左前缀原则,里如现在以(name,age)建立联合索引,B+中是按照字段或者字符顺序排序的,当where name like ‘周%’的时候,你也可以用到所建立的联合索引。查出第一个字段是周的索引后依次向后查询知道不满足条件。
以上,我们建立联合索引的时候需要注意索引的字段的排序,遇上边相同的索引如果我想where age like '%5%'则此索引无法生效。这里我们评估的是索引的复用能力,当有(a.b)作为索引的时候就无需把a单独设置为索引了。需要用b查询需要把b设置为索引。
索引当我们建立联合索引的时候需要考虑,是否可以通过调整字段顺序来减少一个单独的索引,或者用(name,age)、age代替(age,name)、name来节约空间(长度name>age)

4.索引下推

在MySQL5.6之前,当索引是(name,age)时候,where name like ‘%周’ and age = 26,查找到‘%周’后需要进行回表后,对回表结果进行 age=26 的判断。
在MySQL5.6引入索引下推优化,优先对索引中包含的字段进行判断,因为索引中包含age索引,所以直接判断age=26,能减少一部分回表次数。