MySQL-索引

目录

索引概述

介绍

演示

优缺点

索引结构

概述

二叉树

B-Tree(B树)

B+Tree(B+树)

Hash

索引分类

索引语法

SQL性能分析

SQL执行频率

慢查询日志

profile详情

explain执行计划

索引使用

最左前缀法则

范围查询

索引失效情况

索引列运算

字符串不加引号 

模糊查询

or连接的条件

数据分布影响

SQL提示

覆盖索引

前缀索引

单列索引与联合索引

索引设计原则


索引概述

介绍

索引(index)是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引

演示

表结构及数据:

执行的SQL语句为:select * from user where age = 45;

无索引情况:

在无索引情况下,需要从第一行开始扫描,一直扫描到最后一行,称之为全表扫描,性能很低

有索引情况:

如果建立了索引,假设索引结构是二叉树,则会对age这个字段建立一个二叉树的索引结构:

此时查询只需要扫描三次就可以找到数据,极大提高了查询效率

备注:只是假设索引结构是二叉树,并不是索引的真实结构

优缺点

索引结构

概述

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种:

不同的存储引擎对索引结构的支持情况:

注意:平常所说的索引,如果没有特别指明,都是指B+树索引

二叉树

假如MySQL的索引结构采用二叉树的数据结构,比较理想的结构如下:

如果主键是顺序插入的,则会形成一个单向链表,结构如下:

因此,二叉树的缺点:

  • 顺序插入时,会形成一个链表,查询性能大大降低
  • 大数据量情况下,层级较深,检索速度慢

如果选择红黑树,红黑树是一棵自平衡二叉树,即使是顺序插入数据,最终形成的数据结构也是一棵平衡的二叉树,结构如下:

即使如此,红黑树也存在缺点:

  • 大数据量情况下,层级较深,检索速度慢

B-Tree(B树)

B-Tree(B树)是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉

以一棵最大度数(max-degree)为5(5阶)的B树为例,那这个B树每个节点最多存储4个key,5个指针:

【树的度数指的是一个节点的子节点个数】

数据结构可视化网站:B-Tree Visualization

插入一组数据:100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88 120 268 250

特点:

  • 5阶的B树,每一个节点最多存储4个key,对应5个指针
  • 一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂
  • 在B树中,非叶子节点和叶子节点都会存放数据

B+Tree(B+树)

B+树是B树的变种,以一棵最大度数为4(4阶)的B+树为例,结构如下:

两部分:

  • 绿色框的部分,是索引部分,仅仅起到索引数据的作用,不存储数据
  • 红色框的部分,是数据存储部分,在其叶子节点中要存储具体的数据

可视化演示:B+ Tree Visualization

插入一组数据:100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88 120 268 250

B+树与B树相比,主要有以下三点区别:
  • 所有的数据都会出现在叶子节点
  • 叶子节点形成一个单向链表
  • 非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的

MySQL优化后的B+树:

MySQL索引数据结构对经典的B+树进行了优化,在原B+树的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+树,提高区间访问的性能,利于排序:

Hash

MySQL中除了支持B+树索引,还支持Hash索引

结构:

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中:

如果两个(或多个)键值映射到一个相同的槽位上,就会产生hash冲突(也称为hash碰撞),可以通过链表来解决:

特点:

  • Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,< ,...)
  • 无法利用索引完成排序操作
  • 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+树索引

存储引擎支持:

在MySQL中,支持hash索引的是Memory存储引擎。 而InnoDB中具有自适应hash功能,hash索引是 InnoDB存储引擎根据B+树索引在指定条件下自动构建的

  

思考题:为什么InnoDB存储引擎选择使用B+树索引结构?

  • 相对于二叉树,层级更少,搜索效率高
  • 对于B树,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低
  • 相对Hash索引,B+树支持范围匹配及排序操
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值