美文网首页MySQL
Mysql联合索引的最左前缀原则以及b+tree

Mysql联合索引的最左前缀原则以及b+tree

作者: 文档随手记 | 来源:发表于2020-08-28 11:13 被阅读0次

联合索引的好处

       覆盖索引,这一点是最重要的,重所周知非主键索引会先查到主键索引的值再从主键索引上拿到想要的值,这样多一次查询索引下推。但是覆盖索引可以直接在非主键索引上拿到相应的值,减少一次查询。

        在一张大表中如果有 (a,b,c)联合索引就等于同时加上了 (a) (ab) (abc) 三个索引减少了存储上的一部分的开销和操作开销

        梯度漏斗,比如 select *from t where a = 1 and b = 2 and c = 3; 就等于在满足 a = 1 的一部分数据中过滤掉b = 2 的 再从 a = 1 and b = 2 过滤掉 c = 3 的,越多查询越高效。

   最左原则

    即最左优先,在检索数据时从联合索引的最左边开始匹配,类似于给(a,b,c)这三个字段加上联合索引就等于同时加上了 (a) (ab) (abc) 这三种组合的查询优化

    举个栗子:

CREATE TABLE `user`  (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(25),

  `sex` varchar(25) ,

  `city` varchar(25) ,

  PRIMARY KEY (`id`) USING BTREE,

  INDEX `name`(`name`, `sex`, `city`) USING BTREE

)

EXPLAIN select *from`user` where sex='';

这样是无法触发联合索引的,因为不符合最左原则,没有命中(a) (ab) (abc) 这种组合

+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+--------------------------+| id | select_type | table | partitions | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra                    |+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+--------------------------+|  1 | SIMPLE      | user  | NULL      | index | NULL          | name | 309    | NULL |    3 |    33.33 | Using where; Using index |+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+--------------------------+1 rowinset (0.02 sec)

   另外使用执行计划一定要看结果,只有possible_keys有值的情况下才是命中索引

   查询条件要符合最左原则才能使用到索引

    注意:where条件的顺序是否会影响索引的命中,就是本来(ab)的组合,故意写where语句时写成(ba),答案是没有影响,只要遵循了索引的最左原则即可,至少在mysql5.7测试没有问题。

    最后,谈谈索引的底层数据结构b+tree

    我们知道BTREE 每个节点都是一个二元数组: [key, data],所有节点都可以存储数据。key为索引key,data为除key之外的数据。

    查找算法:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或未找到节点返回空指针

    B+Tree有以下不同点:非叶子节点不存储data,只存储索引key;只有叶子节点才存储data,而Mysql中B+Tree:在经典B+Tree的基础上进行了优化,增加了顺序访问指针。在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。这样就提高了区间访问性能:请见下图,如果要查询key为从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历即可

依据来源(官网的文档 ):https://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html

相关文章

  • 索引

    这道题目考察的知识点是MySQL组合索引(复合索引)的最左优先原则。 最左前缀匹配原则 在mysql建立联合索引时...

  • Mysql联合索引的最左前缀原则以及b+tree

    联合索引的好处 覆盖索引,这一点是最重要的,重所周知非主键索引会先查到主键索引的值再从主键索引上拿到想要的值...

  • Mysql索引失效

    mysql 索引失效的原因有哪些?Mysql索引失效的原因 1、最佳左前缀原则——如果索引了多列,要遵守最左前缀原...

  • 索引的限制

    B-tree 最左前缀原则 联合索引 index(name, age, sex)查询条件不包括最左列,无法使用索引...

  • 我去,为什么最左前缀原则失效了?

    问题 最近,在 mysql 测试最左前缀原则,发现了匪夷所思的事情。根据最左前缀原则,本来应该索引失效,走全表扫描...

  • MySQL最左前缀原则

    通过实例理解单列索引、多列索引以及最左前缀原则 实例:现在我们想查出满足以下条件的用户id: mysql>SELE...

  • 索引最左前缀匹配

    最左前缀原理 联合索引中查找遵循最左前缀原理:例如,建立如下(a,b,c,d)的联合索引,索引结构会按照a,b,c...

  • 联合索引

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

  • mysql索引的最左前缀原则

    联合索引有一个最左前缀原则,所以建立联合索引的时候,这个联合索引的字段顺序非常重要下面写了例子说明这个: 以上表结...

  • 最左前缀有手就会,那索引下推呢?

    联合索引的最左前缀原则属于面试高频题,想必大部分同学都知道一些,但是,那些不符合最左前缀的部分,会怎么样呢(索引下...

网友评论

    本文标题:Mysql联合索引的最左前缀原则以及b+tree

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