【MySQL】索引 简介

1.索引是什么

  官方定义:索引(Index)是帮助MySQL高效获取数据的数据结果,由此可知,索引是一种数据结构。我们可以理解为索引是排好序的实现快速查找的数据结果
  由此可见,除数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查询算法,这种数据结构就是索引。下图为一种可能的索引方式:
这里写图片描述
  左边存储的是真正的数据,最左边是数据记录的物理地址;右边是索引,为了加快Col2的查找,可维护一个右边所示的二叉查找数,每个节点分别包含索引建值和一个指向对应数据记录的物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应的数据,从而快速的检索出符合条件的记录


2.为什么要用索引

  提高查询效率,可类比字典,如果要查询“mysql”这个单词,我们首先定位到m,然后往下找到y,再找sql,如果没有索引,我们必须a——z所有一遍遍的遍历,或许第一次就找到了m,或许是最后一次找到的m,而我们建了索引,直接就可以定位


3.索引的存储方式

  一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上


4.索引的操作

创建索引

CREATE [UNIQUE] INDEX indexName ON mytable(列名1,列名2)
ALTER mytable ADD [UNIQUE] INDEX indexName ON (列名1,列名2)

这里写图片描述
删除索引

DROP INDEX indexName ON mytable;

查看索引

SHOW INDEX FROM mytable

  索引影响的是where和order by条件


5.优势

  • 提高检索效率,降低数据库的IO成功(因为每次的查询都会进行一次IO,而索引减少了查询次数)
  • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗(因为有了索引该列就自动排序了,再执行排序时就不用排序了)

6.劣势

  • 实际上索引也是一张表,该表保存了主键和索引字段,并执行实体表的记录,所以索引列也要占用空间
  • 降低了更新表的速度(insert,update,delete操作),因为更新表时,mysql不仅要保存数据,还要更新建值变化后的索引信息。总之:更新时,数据在变,索引也在变
  • 若数据量大,要考虑建立最优的索引

7.mysql索引分类

  • 单值索引:一个索引列只包含单个列,一个表可有多个单列索引
  • 唯一索引:索引类的值必须唯一,但允许为空
  • 复合索引:一个索引包含多列

8.mysql索引结构

索引结构分为:

  • BTree索引
  • Hash索引
  • full-text全文索引
  • R-Tree索引

这里写图片描述
【初始化介绍】
  一 颗 b + 树 , 浅 蓝 色 的 块 我 们 称 之 为 一 个 磁 盘 块 , 可 以 看 到 每 个 磁 盘 块 包 含 几 个 数 据 项 ( 深 蓝 色 所 示 ) 和 指 针 ( 黄 色 所 示 ) ,如 磁 盘 块 1 包 含 數 据 项 17 和 35 , 包 含 指 针 PI 、 P2 、 P3 , PI 表 示 小 于 17 的 磁 盘 块 , P2 表 示 在 17 和 35 之 同 的 磁 盘 块 , P3 表 示 大 于 35 的 磁 盘 块 ,真实的数据存在于叶子节点, 即 3 、 5 、 9 、 10 、 13 、 15 、 28 、 29 、 36 、 60 、 75 、 79 、 90 、 99 。非 叶 子 节 点 不 存 储 真 实 的 数 据 , 只 存 储 指 引 搜索方 向 的 数 据 项 , 如 17 、 35 并 不 真 实 存 在 于 数 据 表 中 ·
【查找过程】
  如 果 要 查 找 撖 据 项 29 , 那 么 首 先 会 把 磁 块 1 由 磁 盘 加 载 到 内 存 , 此 时 发 生 一 次 IO , 在 内 存 中 用 二 分 查 找 确 定 29 在 17 和 35 之 同 , 锁 定 磁 盘 块1 的 P2 指 针 , 内 存时间 非 常 短 ( 相 比 磁 盘 的 IO ) 可 以忽略 不 计 , 通 过 磁 盘 块 1 的 P2 指 针 的 磁盘 地 址 把 磁盘 块 3 由 磁 盘 加载 到 内 存 , 发 生 第 二 次IO , 29 在 26 和 30 之 同 , 锁 定 磁 盘 块 3 的 P2 指 针 , 通过指 针加载磁 盘 块 8 到 内 存 , 发 生 第 三 次IO , 同 时 内 存 中 做 二 分 查找找到 29 , 结 束 查 询 , 总 计 三 次IO。真 实 的 情 况 是 , 3 层 的 b + 树 可 以 表 示 上 百 万 的 数 据 , 如 果 上 百 万 的 数 据 查 找 只需要 三 次 IO 性 能 提 高 将 是 巨 大 的 , 如 果 没 有 索引 , 每 个 数 据 项 都 要 发 生 一 次 IO, 那么总共需要百万次的IO,显然成本非常非常高


9.哪些情况需要创建索引

  • 主键自动建立唯一索引
  • 频繁作为查询条件的字段
  • 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
  • 查询中统计或分组的字段
  • 查询中与其他表关联的字段,即外键

10.哪些情况不需要创建索引

  • 表记录太少
  • 频繁更新的字段
  • where条件用不到的字段
  • 某个数据类包含许多重复的内容(如性别)

索引的选择性:指索引类中不同值的数目与表中记录数的比。如果一个表中有2000条记录,表索引类有1980个不同的值,那么这个索引的选择项就是1980/2000=0.99,一个索引的选择性越接近于1,这个索引的效率就越高

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值