美文网首页
联合索引-以及如何使用索引

联合索引-以及如何使用索引

作者: Franck_ | 来源:发表于2020-11-07 20:23 被阅读0次

联合索引

建立索引的时候,尽量建立联合索引,即多个字段组成1个索引。因为如果针对单个字段建立索引的话,会造成索引过多,每次插入数据都会维护多个索引,导致数据加入性能过慢。索引条目里面一定会带一个id,区分大小的唯一主键。

聚合索引就是根据多个字段建立起来的索引,索引树的最底层的数据页保存的是索引字段+主键字段。如果字段值一样的话,就按照下一个字段排序。例如,建立一个persion表, 有字段 id,name, age , height ,weight,phone 。
然后用age ,height 建立联合索引,如下图:

联合索引.png

这时候,添加一个age=18,height=177的用户的添加过程是去到索引页1,发现age >15并且age <20 ,所以这条记录会添加到数据页1。 然后去数据页1根据age进行二分查找,发现age>最后一条数据(id=4),这时候就将需要添加的数据,加到最后一条后面。

如果再添加一条数据age=21 ,height=167。 首先去到索引页1用age进行二分查找,发现应该添加到数据页2。然后去数据页2进行二分查找,发现age=21和id=6,id=7的数据age一样。 然后就看第二个字段height=167,比id=6的166大,比id=7的170小,所以就添加到id=6 和 id=7的数据中间。

如果遇到字段都一样的,就根据ID的大小来排序。

索引匹配规则

1 全值匹配规则

在where子句里面的字段,条件都是用“=”等号,字段和也索引里面的字段一致,顺序不一致也没关系,SQL优化会自动进行重新排序。这时候就可以100%使用索引进行查询。

2 最左列匹配

例如上面的例子,如果查询的时候,是使用age = xx 查询,那么就可以用上索引。如果跳过age,使用height=XX来查询,那么是没办法使用到索引的,因为索引的排序是根据建立索引的字段顺序来排序的。

3 最左前缀匹配

查询的时候,如果使用了like类型的模糊匹配, like%,这样的写法是可以用索引的,当然要符合最左列匹配规则。 如果是%like 这样的写法,是无法使用索引的,因为无法确认字段的开始字符串是什么,所以就无法用来和索引进行对比。

4 范围查找规则

如果使用了范围查找,使用索引的最左列字段来查找是可以使用索引查找的。因为索引的每一层和数据页都是通过双向量表连接起来的。 例如age > 15 and age < 21,那么就可以定位到数据页1,id=1的数据和数据页2,id=5的数据,然后取个范围内的数据就可以了。

但是如果用的是height来做范围查找就用不了索引: height >170 and height <180。 这时候数据页1 和数据页2 都是存在符合条件的数据的,但是,数据页内,没有按照height来排序,所以,需要遍历才能找到,然后数据页2也需要遍历才能找到。

5 等值匹配+范围匹配规则

第一个条件是使用了=来匹配,如果这个条件的字段是索引的第一个字段,那么是会走索引的, 然后第二个条件,如果是按照范围来查找, 如果这个字段是索引的第二个字段,那么也可以用到索引, 再来第三个条件, 如果是=号匹配,这个条件也是索引的第三个字段的话,就可以用索引,如果是用范围匹配, 那么是用不了索引的。 原因是,索引用第二个字段进行了排序, 然后第三个字段是在第二个字段相同的情况下,再进行排序。

记住一个原则就是, 索引有3个字段, 先用第一个字段进行排序, 如果第一个字段一样,就用第二个字段排序, 如果第二个字段的值也一样, 那么就用第三个字段排序。 根据这个排序的规则,去匹配查询的条件,即可知道这5个索引的匹配规则。

进行排序的时候使用索引

排序的时候也符合索引使用规则, 使用索引的字段进行排序的话,就可以直接从索引里面,直接获取数据即可。 用上面的例子,如果有SQL :

SELECT * FROM persion  order by age limt 2;

本身索引就是按照age和height来排序的,所以直接可以在索引里面找到对应的数据,然后取前面2条返回。 升序和降序都没关系,都可以找到一个连续确定的范围。索引默认是从小到大排序。

如果排序是order by age desc height asc,那就不会使用到索引,因为索引也是按照从小到大排序的,遇到第一个字段相同值的,就按照第二个字段从小到大排序。

进行分组的时候使用索引

使用grouop by的时候,也是注意使用索引最左列来分组, 这样,就可以按照顺序,重一定的范围内提取出整个分组数据,然后再对这个分组数据进行操作。 就不需要从无序的数据里面,重新进行排序再提取,这样就会涉及到很多硬盘交互操作。

相关文章

  • 联合索引-以及如何使用索引

    联合索引 建立索引的时候,尽量建立联合索引,即多个字段组成1个索引。因为如果针对单个字段建立索引的话,会造成索引过...

  • SQL与索引优化合集

    一、《索引的概念与通用技巧》 内容:聚集索引,非聚集索引,联合索引,索引覆盖的概念以及使用技巧 二、《or、in、...

  • PHP题目分享与答案(2)

    2:索引分为哪些?如何创建索引?索引如何优化?A,B,C联合索引如何才能命中索引? MySQL索引分为主键索引,唯...

  • MySQL - 索引优化技巧

    联合索引 在建立索引的时候,尽量在多个单列索引上判断下是否可以使用联合索引,联合索引使用不仅可以节省空间,还可以更...

  • 一文搞懂MySQL行锁、表锁、间隙锁详解

    前言 我们前几篇讲了索引是什么,如何使用 explain 分析索引使用情况,如何去优化索引,以及show prof...

  • 一文搞懂MySQL行锁、表锁、间隙锁详解

    前言 我们前几篇讲了索引是什么,如何使用 explain 分析索引使用情况,如何去优化索引,以及 show pro...

  • Mysql 索引优化

    联合索引和单个索引选择 对比,值越大越好 强制使用某个索引 使用explain分析索引 1、id:SQL执行的顺序...

  • Mysql联合索引最左匹配原则

    [toc] 为什么使用联合索引 以联合索引(a,b,c)为例 建立这样的索引相当于建立了索引a、ab、abc三个索...

  • mysql联合索引与单列索引

    一、联合索引 数据表如上图,数据表中700百万数据,索引:使用了 SITEID与COLLECTTIME的联合索引 ...

  • 联合索引

    联合索引的创建原则 使用次数较为频繁的放在最左端。(此时甚至可为其单独建立索引) 联合索引存在“最左原则”。 最左...

网友评论

      本文标题:联合索引-以及如何使用索引

      本文链接:https://www.haomeiwen.com/subject/hsrbvktx.html