·必答内容:
在MySQL默认的InnoDB存储引擎中,有两类索引,分别是:聚簇索引和二级素引。聚簇索引,他的特点呢就是数据与素引存放在一块儿,B+tree索引结构的叶子节点保存了整行数据,而且在一张表中,聚簇索引有且仅有个,默认主键索引就是聚簇索引。二级素引,指的是数据和索引分开存储,B+tree的叶子节点保存对应的主键二级索引在一张表中可以有多个。
所谓回表查询,就指的是,在执行这条SQL语句的时候,先根据二级素引去检索出对应的主键值;然后再根据主键值,到聚族素引中查询出对应的数据,这个过程就叫回表查询,所以回表查询,是需要扫描两次素引的,性能相对来说会差一些。
进阶内容:
所以,在项目开发中,我们进行SQL优化的时候,如果需求允许的情况下,尽量避免回表查询,主要从以下几个方面来做:
1).业务允许的情况下,尽可能根据主键查询,使用聚集素引-避免回表查询.2).为表中的字段,根据业务需求创建合适的联合素引,查询时使用素引覆盖-避免回表查询。3).使用素引下推,减少回表查询的次数。【系引下推,是mysql5.6之后提供的功能】
0
可能继续发问的问题:
你刚才提到素引下推,简单聊聊什么是素引下推?
索引下推(Index Condition Pushdown),是MySQL5.6后提供的功能,指的是在多条件查询SQL执行时,提前判断对应的搜索条件是否满足,满足了再去回表(就是将本应该在 server 层进行筛选的条件,下推到存储引擎层来进行筛选判断,这样能有效减少回表),通过减少回表次数进而提高查询效率。
2.4 为什么MySQL索引结构是B+tree ?
·必答内容:
其实这个问题,我们可以做一个假设啊。
假设素引结构是二叉搜索树、平衡二叉树 或 红黑树等,其实本质都是二叉树,一个节点下最多只能有两个子节点,如果这张表要存储的数据量比较大,二叉树的层级将会非常深,检索效率会很低而如果素引结构是Btree,在B树中,非叶子节点和叶子节点既要要存储key和指针,还要存放数据,而InnoDB的物理存储结构中,一页(Page)的大小是固定的,就是16KB。那这一页中能够存储的key的数量并不多,就会造成大数据量情况下,树的层级较深,检索速度慢。还有一个问题,就是由于 非叶子节点和叶子节点既要要存储key,还要存放数据,查找效率并不稳定。(有些数据,只需要一次查找,有些数据,可能需要五六次,有些..)
所以,在MySQL数据库中才使用了B+tree作为系引的数据结构。主要有以下优势:在B+tree中,非叶子节点并不存放数据,只存放key和指针,所以一页(Page)中能够容纳的key将更多,相司数据量的情况下,树的层级要浅的多,检索效率高。
所有的数据都存储在B+tree的叶子节点中,也就意味着无论什么数据,都需要找到叶子节点才能查询到对应的数据,检索效率更加稳定。
第三是B+树数据都存储在B+tree的叶子节点,并形成了一个双向链表,便于区间范围查询。可能继续发问的问题: