
Leaf Page 拆分
最后插入一个节点 95,这时刻 Index Page 和 Leaf Page 都满了,就须要做两次拆分,如下图所示。

- select user_id from trade where user_group_id = 1 and trade_amount > 0
Leaf Page 与 Index Page 拆分
拆分后最终形成了如许一颗树。

最终树
B+Tree 为了保持均衡,对于新插入的值须要做大年夜量的拆分页操作,而页的拆分须要 I/O 操作,为了尽可能的削减页的拆分操作,B+Tree 也供给了类似于均衡二叉树的扭转功能。当 Leaf Page 已满但其阁下兄弟节点没有满的情况下,B+Tree 并不急于去做拆分操作,而是将记录移到当前地点页的兄弟节点上。平日情况下,左兄弟会被先检查取来做扭转操作。就比瘸琅绫擎第二个示例,当插入 70 的时刻,并不会去做页拆分,而是左旋操作。

- select * from where id + 1 = 5
左旋操作
经由过程扭转操作可以最大年夜限度的削减页决裂,大年夜而削减索引保护过程中的磁盘的 I/O 操作,也进步索引保护效力。须要留意的是,删除节点跟插入节点类似,仍然须要扭转和拆分操作,这里就不再解释。
高机能策略
经由过程上文,信赖你对 B+Tree 的数据构造已经有了大年夜致的懂得,但 MySQL 中索引是若何组织数据的存储呢?以一个简单的示例来解释,假如有如下数据表:
- CREATE TABLE People(
- last_name varchar(50) not null,
- first_name varchar(50) not null,
- dob date not null,
- gender enum(`m`,`f`) not null,
- key(last_name,first_name,dob)
- );
对于表中每一行数据,索引中包含了 last_name、first_name、dob 列的值,下图展示了索引是若何组织数据存储的。

可以看到,索引起首根据第一个字段来分列次序,当名字雷同时,则根据第三个字段,即出身日期来排序,恰是因为这个原因,才有了索引的 “最左原则”。
1. MySQL 不会应用索引的情况:非自力的列
“自力的列” 是指索引列不克不及是表达式的一部分,也不克不及是函数的参数。比如:
我们很轻易看出其等价于 id = 4,然则 MySQL 无法主动解析这个表达式,应用函数是同样的事理。
2. 前缀索引
如不雅列很长,平日可以索引开端的部分字符,如许可以有效节约索引空间,大年夜而进步索引效力。
3. 多列索引和索引次序
在多半情况下,在多个列上建立自力的索引并不克不及进步萌芽机能。来由异常简单,MySQL 不知道选择哪个索引的萌芽效力更好,所以在老版本,比如 MySQL5.0 之前就会随逼揭捉?择一个列的索引,而新的版本会采取归并索引的策略。举个简单的例子,在一张片子演员表中,在 actor_id 和 film_id 两个列上都建立了自力的索引,然后有如下萌芽:
老版本的 MySQL 会随机选择一个索引,但新版本做如下的优化:
是以 explain 时如不雅发明有索引归并(Extra 字段出现 Using union),应当好好检查一下萌芽和表构造是不是已经是最优的,如不雅萌芽和表都没有问题,那只能解释索引建的异常糟糕,应当慎重推敲索引是否合适,有可能一个包含所有相干列的多列索引更合适。
前面我们提到过索引若何组织数据存储的,大年夜图中可以看到多列索引时,索引的次序对于萌芽是至关重要的,很明显应当把选择性更高的字段放到索引的前面,如许经由过程第一个字段就可以过滤掉落大年夜多半不相符前提的数据。
索引选择性是指不反复的索引值和数据表的总记录数的比值,选择性越高萌芽效力越高,因为选择性越高的索引可以让 MySQL 在萌芽时过滤掉落更多的行。独一索引的选择性是 1,这时最好的索引选择性,机能也是最好的。
推荐阅读
开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散 Hadoop的搭建有三种方法,单机版合适开辟调试;伪分布式版,合适模仿集群进修;完全分布式,临盆应用的模式。这篇文件介绍若何搭建完>>>详细阅读
本文标题:万字干货总结:MySQL优化原理学习,这一篇就够了!
地址:http://www.17bianji.com/lsqh/39574.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示