MySQL 学习笔记三【索引优化】

============================================

MySQL学习笔记【第三部分】

============================================

一. Explain关键字

在这里插入图片描述
Explain已在上一章节详细介绍过了,这里只是为了让读者对Explain有个整体概念。

二. B-Tree、B+Tree

1.B-Tree

在这里插入图片描述在这里插入图片描述

2.B+Tree

B+树可以说是B树的一种变形,它把数据都存储在叶结点,而内部结点只存关键字和孩子指针,因此简化了内部结点的分支因子,B+树遍历也更高效,其中B+树只需所有叶子节点串成链表这样就可以从头到尾遍历,其中内部结点是并不存储信息,而是存储叶子结点的最小值作为索引
B+树用于数据库和文件系统中,NTFS等都使用B+树作为数据索引,
1)有n棵子树的结点含有n个关键字,每个关键字都不会保存数据,只会用来索引,并且所有数据都会保存在叶子结点;
2)所有的叶子结点包含所有关键字信息以及指向关键字记录的指针,关键字自小到大顺序连接;
在这里插入图片描述
为什么说B+树比B树更适合做操作系统的数据库索引和文件索引?
(1)B+树的磁盘读写的代价更低
(2)B+树的查询更加的稳定
(3)B+树是B-树的变种(PLUS版)多路绝对平衡查找树,他拥有B-树的优势
(4) B+树扫库、表能力更强
(5)B+树的磁盘读写能力更强
(6)B+树的排序能力更强

B-Tree、B+Tree区别

  • B+节点关键字搜索采用闭合区间
  • B+非叶节点不保存数据相关信息,只保存关键字和子节点的引用
  • B+关键字对应的数据保存在叶子节点中
  • B+叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系

三. 索引优化详解

1.MySQL中的B+Tree体现形式

Myisam
在这里插入图片描述在这里插入图片描述
InnoDB
在这里插入图片描述在这里插入图片描述Myisam Vs InnoDB
在这里插入图片描述

2.索引知识补充

正确的创建合适的索引 是提升数据库查询性能的基础

为什么要使用索引?

  • 索引能极大的减少存储引擎需要扫描的数据量
  • 索引可以把随机IO变成顺序IO
  • 索引可以帮助我们在进行分组、排序等操作时,避免使 用临时表

选择性
在这里插入图片描述
离散型
在这里插入图片描述
索引选择原则
在这里插入图片描述

聚簇索引和非聚簇索引

innodb的次索引指向对主键的引用 (聚簇索引)
myisam的次索引和主索引 都指向物理行 (非聚簇索引)

聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引(理由:数据一旦存储,顺序只能有一种)。
在《数据库原理》一书中是这么解释聚簇索引和非聚簇索引的区别的:聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。

聚簇索引的优点:

  • 聚簇索引的更新代价比较高,如果更新了行的聚簇索引列,就需要将数据移动到相应的位置。这可能因为要插入的页已满而导致“页分裂”。
  • 插入速度严重依赖于插入顺序,按照主键进行插入的速度是加载数据到Innodb中的最快方式。如果不是按照主键插入,最好在加载完成后使用OPTIMIZE TABLE命令重新组织一下表。
  • 聚簇索引在插入新行和更新主键时,可能导致“页分裂”问题。
  • 聚簇索引可能导致全表扫描速度变慢,因为可能需要加载物理上相隔较远的页到内存中(需要耗时的磁盘寻道操作)。

聚簇索引的缺点:

  • 聚簇索引将索引和数据行保存在同一个B-Tree中,查询通过聚簇索引可以直接获取数据,相比非聚簇索引需要第二次查询(非覆盖索引的情况下)效率要高
  • 聚簇索引对于范围查询的效率很高,因为其数据是按照大小排列的。
3.索引优化口诀

全值匹配我最爱,最左前缀要遵守; 带头大哥不能死,中间兄弟不能断; 索引列上少计算,范围之后全失效; LIKE百分写最右,覆盖索引不写*; 不等空值还有OR,索引影响要注意; VAR引号不可丢, SQL优化有诀窍。