MySQL-索引

为什么需要索引?

定义:索引是一个列或多个列进行排序的数据结构

作用:索引能大幅提高查找效率

缺点:创建和更新索引会耗费 空间和时间

查找结构进化

一个个找:实现简单:太慢
二分查找:有序:简单:要求是有序的,插入特别慢
HASH:查询快 ;占用空间;不太适合存储大规模数据
二叉查找树bst :插入和查询很快(log(n):无法存大规模数据,复杂度退化
平衡树:解決bst 退化的问题,树是平衡的;节点非常多的时候,依然树高很高
多路查找树:一个父亲多个孩子节点(度);节点过多树高不会特别深,
多路平衡查找树- B-Tree

B-Tree多路平衡查找树

定义:

  • 每个结点最多有m个孩子结点,m>=2
  • 叶子结点有相同的深度
  • 节点中的key从左到右递增

B+-Tree

改进B-Tree

  • 所有叶子结点包含全部关键字信息及指向相关记录的指针
  • 相邻叶子结点被双向指针相互链接起来(支持顺序查找,范围查找)
  • 非叶子节点只存一个最值和一个指向子节点的指针

不是阶越大越好

  • 磁盘块的大小来确定B+Tree的叶子节点的大小

索引类型

  • 普通索引 CREATE INDEX
  • 唯一索引 CREATE UNIQUE INDEX
  • 多列索引
  • 主键索引 PRIMARY KEY
  • 全文索引(INNODB不支持),倒排索引实现

什么时候创建索引?

  • 经常用作where条件的字段
  • 经常用作表连接
  • 经常出现在order by 、group by后面的

创建索引注意点

  • NOT NULL, 空值B+Tree很难做比较
  • 区分度高,离散度大的字段,太多相同的值比较浪费时间
  • 索引长度最好不要太长

索引什么时候失效

1.模糊匹配

%like语句,模糊搜索

2.隐式类型转换(python动态语言)

go/python中的类型和数据库类型不一样不好比较

3.联合索引没有满足最左原则

总结:key无法满足B+Tree的没有办法直接比较的时候索引就会失效

聚集索引和非聚集索引

聚集索引(INNODB):
  • B+Tree叶子结点存储的是表数据,如:主键索引,一个文件保存数据表和索引

  • 其他列作为辅助索引:B+Tree存储的是 主键值,再通过主键找数据

非聚集索引(MYisam):
  • B+Tree叶子结点存储的是指向数据的指针,多个文件(一个是存储索引B+Tree, 一个文件存储数据表)

排查’慢查询‘

通常是,缺少索引,索引字段不合理,业务代码导致

  • 开启慢查询日志,并查看
  • 通过explain排查索引问题
  • 比如 数据类型不匹配导致全表扫描,数据太多分页查询

MYsql连接语句

inner join

left join / right join

Full join (mysql不支持), 可以用union联合左链接和右链接

posted @ 2022-08-25 10:47  aleiyoy  阅读(21)  评论(0编辑  收藏  举报