mysql怎么组合索引 mysql组合索引存储结构( 三 )


如果你要查的是所有名字第一个字是“张”的人,你的 SQL 语句的条件是"where name like ‘张
%’" 。这时,你也能够用上这个索引,查找到第一个符合条件的记录是 ID3 , 然后向后遍历,直
到不满足条件为止 。
可以看到,不只是索引的全部定义,只要满足最左前缀,就可以利用索引来加速检索 。这个最左
前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符 。
基于上面对最左前缀索引的说明,我们来讨论一个问题:在建立联合索引的时候 , 如何安排索引
内的字段顺序 。
这里我们的评估标准是,索引的复用能力 。因为可以支持最左前缀,所以当已经有了 (a,b) 这个
联合索引后,一般就不需要单独在 a 上建立索引了 。因此 , 第一原则是,如果通过调整顺序,可
以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的 。
所以现在你知道了 , 这段开头的问题里,我们要为高频请求创建 (身份证号,姓名)这个联合索
引,并用这个索引支持“根据身份证号查询地址”的需求 。
那么,如果既有联合查询,又有基于 a、b 各自的查询呢?查询条件里面只有 b 的语句,是无法
使用 (a,b) 这个联合索引的 , 这时候你不得不维护另外一个索引 , 也就是说你需要同时维护
(a,b)、(b) 这两个索引 。
这时候,我们要考虑的原则就是空间了 。比如上面这个市民表的情况,name 字段是比 age 字段
大的 ,那我就建议你创建一个(name,age) 的联合索引和一个 (age) 的单字段索引 。
MySql 索引(聚集索引 , 辅助索引 , 联合索引 , 覆盖索引..)引入一个面试问题:
看完以下以后再回顾,会发现迎刃而解
Mysql 可以为每一张表设置 存储引擎 这里我们只说 InnoDB 存储引擎.
由于实际情况,数据页只能按照一棵 B+树 进行排序, 因此每张表只能拥有一个 聚集索引(即 主键) 。
栗子:
每个叶子节点的索引行中包含了一个书签(bookmark). 该书签是用来告诉 InnoDB存储引擎哪里可以找到该索引对应的数据行或者说 行数据! 由于InnoDB存储引擎表,是按照主键来构建的,所以 ,该书签内其实包含或者说指向了 数据行所对应的聚集索引键
也就是说 辅助索引的 叶结点保存了 指向对应数据的 聚集索引,可以通过该聚集索引 找到对应的数据行
辅助索引的存在并不影响数据在聚集索引中的组织,因为每张表上可以有多个辅助索引 。
当通过辅助索引来寻找数据时,InnoDB 存储引擎会遍历辅助索引并通过叶级别的指针获得指向主键索引(聚集索引)的主键 , 然后再通过聚集索引找到一个完整的数据行 。
例如:
聚集索引辅助索引关系:
: 又叫做组合索引 , 辅助索引的一种 , 和普通创建索引的方式一样,不同的是 可以同时添加多列来作为索引项;
从本质上来说,联合索引也是一课B+树
个人理解: 所谓最左原则,是因为 存储引擎构建组合索引时 是根据最左边的那一列索引项进行排序的,所以使用组合索引,必须满足 条件中必须存在 最左边那一列的索引项 , 这样 才可以找到对应的索引,继而 去寻找对应的数据
: 又叫做 索引覆盖 , InnoDB中支持覆盖索引 , 即 从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录 。
比如 这里没有根据最左原则使用组合索引,但是 优化器依然进行选择

推荐阅读