为什么不用二叉搜索树用B树?
二叉查找树的时间复杂度是O(logN),查找次数和比较次数较少,但是对于磁盘的IO次数,最坏情况下磁盘的IO次数由树的高度决定,所以减少磁盘IO次数就必须压缩树的高度,让瘦高的树尽量变成矮胖的树,这样B树就诞生了

  1. Mysql官方对索引的定义为:索引(index) 是帮助Mysql高效获取数据的数据结构
    可以得到索引的本质: 索引是数据结构
    索引的目的在于提高查询效率,可以类比字典

可以简单的理解为 “排好序的快速查找数据结构”
索引定义 及 B树 B 树 底层原理 - 图1
索引本身之外,数据库还维护着一个满足特点查找算法的数据结构,这些数据结构以某种方式指向数据,
这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引
Mysql 的索引结构就是 BTREE B树
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。
我们平常所说的索引,如果没有特别指明,都是B树(多路树,并不一定是二叉的)结构组织索引,
其中聚集索引,次其索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+数索引
,统称索引。
当然,除了B+树这种类型的索引之外,还有哈希索引(hash index )等

  1. 索引的优势: 类似大学图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本
    通过索引列队数据进行排序,降低数据排序的成本,降低了CPU的消耗
  2. 索引的劣势: 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表记录,所以索引列也是要占空间的
    虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行了INSERT 、UPDATE 和 DELETE。因为更新表试,MYsql不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的的键值变化后的索引信息
    索引只是提高效率的一个因素,如果你的Mysql有大数据的表,就需要花时间研究建立最优秀的索引,或优化查询
  3. 索引的分类
    4.1 单值索引:即一个索引只包含单个列,一个表可以有多个单列索引
    4.2 唯一索引:索引列的值必须唯一,但允许有空值
    4.3 复合索引:即一个索引包含多个列
    4.4 基本语法
    索引定义 及 B树 B 树 底层原理 - 图2
    索引定义 及 B树 B 树 底层原理 - 图3
    索引一般不要超过5个
  4. 索引结构
    5.1 BTree索引
    (图上的红块是指向数据的指针[指向id等于17行的指针],这是B+数没有的
    举例:b数要找id为28行的数据,先找到 17和35的P2指向了的26和30的P2然后又指向了28和29,最后找到了28,然后指向了28这个id行的数据

    索引定义 及 B树 B 树 底层原理 - 图4
    磁盘有段、区、块 , 、
    索引定义 及 B树 B 树 底层原理 - 图5
    5.2 Hash索引
    5.3 full-text 索引
    5.4 R-Tree索引
    5.5 B+ 树
    聚集索引,次其索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+数索引
    索引定义 及 B树 B 树 底层原理 - 图6

6 平衡树的两种 B树 和 B+树 (底层索引架构) (很重要)

  1. 1B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,这样使得B+树每个节点所能保存的关键字大大增加;
  2. 2B+树叶子节点保存了父节点的所有关键字和关键字记录的指针,每个叶子节点的关键字从小到大链接;
  3. 3B+树的根节点关键字数量和其子节点个数相等;
  4. 4B+的非叶子节点只进行数据索引,不会存实际的关键字记录的指针,所有数据地址必须要到叶子节点才能获取到,所以每次数据查询的次数都一样;
  5. B树的基础上每个节点存储的关键字数更多,树的层级更少所以查询数据更快,
  6. 所有指关键字指针都存在叶子节点,所以每次查找的次数都相同所以查询速度更稳定;
  7. 很明显BTree B树)是比B+树效率要高的 如果内存无限大,
  8. 肯定是优先用B树【B树的非叶子节点有向下的指针和指向数据的指针,(
  9. 数据读到内存里加载一次,若找不到指定的数据,就需要再读硬盘,
  10. 把数据存到内存里,再加载内存,这种过程叫[缺页]就发生多次 IO)】
  11. ---------------------------------------------------------------------------
  12. 在有限的内存下,Mysql选择的是B+树
  13. 【因为B+树的非叶子节点,只有数据和向下的指针,
  14. 没有指向数据的指针,一次加载是要比B树要多最少1/3
  15. 多读到内存1/3一次可以找多个数据,(比如一次性读取3个[下图1-1-1])
  16. 减少为了数据多次读的次数,发生IO更少】
  17. ---------------------------------------------------------------------------
  18. 选择B+数的的原因是他的时间复杂度是(log N)的对数
  19. 回顾一下数学: 22次方等于4 23次方是8 log2为底8的对数 就等于3

索引定义 及 B树 B 树 底层原理 - 图7

时间复杂度

索引定义 及 B树 B 树 底层原理 - 图8

空间复杂度

索引定义 及 B树 B 树 底层原理 - 图9
有一本书《算法》,大数据分析,人工智能必须看懂这书,数学不好
##聚簇索引和非聚簇索引
索引定义 及 B树 B 树 底层原理 - 图10
索引定义 及 B树 B 树 底层原理 - 图11


7.哪些情况需要建索引

6.1 主键自动建立唯一索引
6.2 频繁作为查询条件的字段应该创建索引
6.3 查询中与其他表关联的字段,外键关系建立索引
6.4 频繁更新的字段不适合创建索引
6.5 where条件里用不到的字段不创建索引
6.6 单键/组合索引的选择问题,(在高并发下倾向创建组合索引)
6.7 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
6.8 查询中统计或分组字段

8.哪些情况不适合建索引

7.1 表记录太少
7.2 经常增删改的字段
7.3 数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据列建立索引,
如果某个数据包含了许多重复的内容,建索引没多少的效果