Mysql索引(一)

索引是mysql实现的吗?

Mysql体系结构

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

索引是什么

索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构

在这里插入图片描述

为什么要用索引

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

数据结构

  • 二叉查找树,Binary Search Tree

在这里插入图片描述

  • 平衡二叉查找树,Balanced binary search Tree

在这里插入图片描述

OK,那么mysql索引并没有采取这2中数据结构的原因是什么呢?

  • 它太深了
    数据处的(高)深度决定着他的IO操作次数,IO操作耗时大
  • 它太小了
    每一个磁盘块(节点/页)保存的数据量太小了
    没有很好的利用操作磁盘IO的数据交换特性,
    也没有利用好磁盘IO的预读能力(空间局部性原理),从而带来频繁的IO操作
  • 多路平衡查找树,B-Tree

在这里插入图片描述

  • 加强版多路平衡查找树,B+Tree

在这里插入图片描述

  • B+Tree与B-Tree的区别
  • B+节点关键字搜索采用闭合区间
  • B+非叶节点不保存数据相关信息,只保存关键字和子节点的引用
  • B+关键字对应的数据保存在叶子节点中
  • B+叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系
  • 为什么选用B+Tree
  • B+树是B-树的变种(PLUS版)多路绝对平衡查找树,他拥有B-树的优势
  • B+树扫库、表能力更强
  • B+树的磁盘读写能力更强
  • B+树的排序能力更强
  • B+树的查询效率更加稳定(这个需要在某种角度去理解)

Mysql B+Tree索引体现形式

  • Mysql中B+Tree索引体现形式(Myisam)

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

  • Mysql中B+Tree索引体现形式(Innodb)

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

  • Innodb VS Myisam

在这里插入图片描述

索引知识补充整理

  • 列的离散型count(distinct col):count(col)
  • 越大离散性越好,即:数据库一列数据重复程度越少,离散性越高,选择性就越好
  • 最左匹配原则

对索引中关键字进行计算(对比),一定是从左往右依次进行,且不可跳过
在这里插入图片描述

  • 何为联合索引
  • 单列索引----节点中关键字[name]
  • 联合索引----节点中关键字[name,phoneNum]
    注:单列索引是特殊的联合索引
  • 联合索引列选择原则
  • 经常用的列优先 【最左匹配原则】
  • 选择性(离散度)高的列优先【离散度高原则】
  • 宽度小的列优先【最少空间原则】
  • 覆盖索引
  • 如果查询列可通过索引节点中的关键字直接返回,则该索引称之为覆盖索引。
  • 覆盖索引可减少数据库IO,将随机IO变为顺序IO,可提高查询性能

总结

  • 索引列的数据长度能少则少
  • 索引一定不是越多越好,越全越好,一定是建合适的
  • 匹配列前缀可用到索引 like 9999%,like %9999%、like %9999用不到索引
  • Where 条件中 not in 和 <>操作无法使用索引
  • 匹配范围值,order by 也可用到索引
  • 多用指定列查询,只返回自己想到的数据列,少用select *
  • 联合索引中如果不是按照索引最左列开始查找,无法使用索引
  • 联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引
  • 联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引
  • 注:当索引为Innodb时,主键使用<>,也走了索引~~~

第一次开启CSDN篇章!写的不好,希望勿怪!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值