联系我们

邮箱:250206374@qq.com
地址:广东省广州市天河区88号
传真:
手机:
电话:

公司新闻

当前位置:官网首页 > 新闻资讯 > 公司新闻 >

带你从头到尾捋一遍MySQL索引结构(2)

时间:2019-12-20 12:31 来源: 作者:

依据这两个定论,首要需求了解的便是,怎么排序?

单列排序很简单,比巨细嘛,谁都会,可是多列排序是依据什么准则的呢?

实际上在mysql中,联合索引的排序有这么一个准则,从左往右顺次比较巨细,就拿方才树立的索引举比方,他会先去比较age的巨细,假如age的巨细相同,那么比较height的巨细,假如height也无法比较巨细, 那么就比较weight的巨细,终究对这个索引进行排序。

那么依据这个排序咱们也能够画出一个b+树,这儿就不像上文画的那么详细了,简化一下:

数据:

b+树:

留意:此刻由于对错聚簇索引,所以叶子节点不在有数据,而是存了一个主键索引,终究会经过主键索引来回表查询数据。

b+树的结构有了,就能够经过这个来了解最左前缀匹配准则了。

咱们先写一个查询句子

select * from user where age=1 and height = 2 and weight = 7

毋庸置疑,这条句子一定会走idx_obj这个索引。

那么咱们再看一个句子:

select * from user where height=2 and weight = 7

考虑一下,这条sql会走索引吗?

答案是否定的,那么咱们剖析的方向便是,为什么这条句子不会走索引。

上文中咱们提到了一个多列的排序准则,是从左到右进行比较然后排序的,而咱们的idx_obj这个索引从左到右顺次是age,height,weight,所以当咱们运用height和weight来作为查询条件时,由于age的缺失,那么就无法从age来进行比较了。

看到这儿或许有小伙伴会有疑问,那假如直接用height和weight来进行比较不能够吗?显然是不能够的,能够举个比方,咱们把缺失的这一列写作一个问号,那么这条句子的查询条件就变成了?27,那么咱们从这课b+树的根节点开端,根节点上有127和365,那么以height和weight来进行比较的话,走的一定是127这一边,可是假如缺失的列数字是大于3的呢?比方427,527,627,那么假如走索引来查询数据,将会丢掉数据,过错查询。所以这种状况下是肯定不会走索引进行查询的。这便是最左前缀匹配准则的成因。

依据咱们了解的能够得出定论:

只需无法进行排序比较巨细的,就无法走联合索引。

能够再看几个句子:

select * from user where age=1 and height = 2

这条句子是能够走idx_obj索引的,由于它能够经过比较 。

select * from user where age=1 and weight=7

这条句子也是能够走ind_obj索引的,由于它也能够经过比较,走左子树,可是实际上weight并没有用到索引,由于依据最左匹配准则,假如有两页的age都等于1,那么会去比较height,可是height在这儿并不作为查询条件,所以mysql会将这两页全都加载到内存中进行终究的weight字段的比较,进行扫描查询。

select * from user where age 1

这条句子不会走索引,可是能够走索引。这句话是什么意思呢?这条sql很特别,由于其存在能够比较的索引,所以它走索引也能够查询出成果,可是由于这种状况是规模查询并且是全字段查询,假如走索引,还需求进行回表,mysql查询优化器就会以为走索引的功率比全表扫描还要低,所以mysql会去优化它,让他直接进行全表扫描。

select * from user wehre age=1 and height 2 and weight=7

这条句子是能够走索引的,由于它能够经过age进行比较,可是weight不会用到索引,由于height是规模查找,与第二条句子相似,假如有两页的height都大于2,那么mysql会将两页的数据都加载进内存,然后再来经过weight匹配正确的数据。

由于聚簇索引是将索引和数据都存放在叶子节点中,假如一切的索引都用聚簇索引,则每一个索引都将保存一份数据,会形成数据的冗余,在数据量很大的状况下,这种数据冗余是很耗费资源的。

这两个点也是前次写关于索引的博客时漏下的,这儿补上。

1.什么状况下会发作分明创建了索引,可是履行的时分并没有经过索引呢?

科普时刻:查询优化器 一条sql句子的查询,能够有不同的履行计划,至于终究挑选哪种计划,需求经过优化器进行挑选,挑选履行本钱最低的计划。

在一条单表查询句子真实履行之前,mysql的查询优化器会找出履行该句子一切或许运用的计划,比照之后找出本钱最低的计划。这个本钱最低的计划便是所谓的履行计划。

优化进程大致如下:

1、依据查找条件,找出一切或许运用的索引
2、核算全表扫描的价值
3、核算运用不同索引履行查询的价值
4、比照各种履行计划的价值,找出本钱最低的那一个 。