为什么需要索引?
定义:索引是一个列或多个列进行排序的数据结构
作用:索引能大幅提高查找效率
缺点:创建和更新索引会耗费 空间和时间
查找结构进化
一个个找:实现简单:太慢
二分查找:有序:简单:要求是有序的,插入特别慢
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联合左链接和右链接
标签:结点,Tree,叶子,索引,查找,MySQL,节点 From: https://www.cnblogs.com/aleiyoy/p/16623512.html