Mysql索引基础, 索引优化, B树

什么是索引?

  • 索引是数据表中一个或者多个列进行排序的数据结构。
  • 索引能大幅提升检索速度。
  • 创建、更新索引本身也会花费一些时间和空间。

 

索引类型,创建索引。

  • 普通索引(CREATE INDEX)。
  • 唯一索引,索引值必须唯一(CREATE UNIQUE INDEX)。
  • 多列索引。
  • 主键索引(PRIMARY KEY) ,一个表只能有一个。
  • 全文索引(FULLTEXT INDEX), InnoDB不支持。

 

什么时候(字段)来创建索引

  • 经常用做查询条件的字段(WHERE条件)。
  • 经常用做表链接的字段。
  • 经常出现在 order by, group by之后的字段。

 

创建索引有哪些需要注意的地方(最佳实践)?

  • 非空字段(NOT NULL), Mysql很难对空值做查询优化。
  • 作为索引的字段需要: 区分度高,离散度大, 不能有大量相同的值。
  • 索引长度不能太长(字符串比较会耗费时间)。

 

索引失效

  记忆口诀:模糊匹配,类型隐转,最左匹配。

  • 以%开头的like语句,模糊搜索的时候,无法利用索引。
  • 出现隐式类型转换(python查询的时候需要注意, python输入的查询值类型和数据库中的类型不一致的话,会无法利用索引)。
  • 没有满足最左前缀原则

 

什么是B-Tree(Mysql使用的是B+ Tree)

  表格看不明白可以使用数据结构可视化网站: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

  优点 缺点
线性查找
二分查找 速度快了 必须顺序排序,插入慢
HASH 查询快 占用空间,不能储存大量数据
二叉查找树

查处查询都很快(log(n))

复杂度退化,不能储存大量数据
二叉平衡树 解决二叉查找树复杂度退化的问题 节点非常多的时候,树依然很高(因为只有两个儿子节点)
多路查找树 一个父亲多个儿子节点 节点非常多的时候,树不会特别深。
多路平衡查找树(B-Tree) 解决二叉查找树复杂度退化的问题,一个父亲多个儿子节点。

  

  • 多路平衡查找树,每个节点最多m(m>=2)个孩子,成为m阶或者度。
  • 叶节点具有相同的深度。
  • 节点数据中的key从左到右递增的。

    B-tree 有一个问题,不能实现范围查找!

  

 B+ Tree是 B-Tree的变形

  • 只在叶子节点带有指向记录的指针(可以增加树的度)。
  • 叶子节点通过指针相连,实现了范围查询。
posted @ 2022-03-01 22:43  DRQ丶  阅读(34)  评论(0编辑  收藏  举报