mysql的索引

本文详细介绍了MySQL中的索引概念,包括其在数据结构中的作用、优缺点和不同类型的索引结构如B+Tree和Hash。讨论了InnoDB存储引擎为何选择B+tree,并分析了索引的分类,如主键索引和唯一索引。此外,还提供了创建各种索引的SQL语法示例,以及针对具体字段的索引创建策略。
摘要由CSDN通过智能技术生成

1、索引的概述

来自于黑马教程:https://www.bilibili.com/video/BV1Kr4y1i7ru?p=69,快去看吧。草,卷起来
在这里插入图片描述

1、索引的介绍

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

2、索引的优缺点

在这里插入图片描述

2、索引的结构

MySQL的索引是在 存储 引擎层 实现的,不同的存储引擎有不同的结构,主要包含以下几种:
在这里插入图片描述
不同的索引结构 在 不同的引擎当中的支持情况
在这里插入图片描述

二叉树

在这里插入图片描述
在这里插入图片描述
可视化数据结构网站:
https://blog.csdn.net/lht337636295/article/details/106780325/

B+Tree树

黑马 的MySQL视频 很nice的
https://www.bilibili.com/video/BV1Kr4y1i7ru?p=69

在这里插入图片描述
MySQL存储数据的B+Tree树
在这里插入图片描述
所有的数据都会出现在叶子节点,叶子节点形成一个单向的链表;
对于MySQL的存储结构,增加了一个指向相邻叶子节点的链表指针;

下面这里篇文章还是有深度的:
https://blog.csdn.net/wufuhuai/article/details/79631466

Hash

Hash索引特点

  1. Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,<,…)
  2. 无法利用索引完成排序操作
  3. 查询效率高,通常只需要一次检索就可以了,效率通常要高于B+tree索引

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

思考:

为什么InnoDB存储引擎选择使用B+tree索引结构?

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

3、索引的分类

主键索引不能存空值,唯一索引可以
在这里插入图片描述
在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
在这里插入图片描述
聚集索引存储规则
● 如果存在主键,主键就是聚集索引;
● 如果不存在主键,将使用第一个唯一索引作为聚集索引;
● 如果没有主键,或者没有合适的唯一索引。则InnoDB 会自动生成一个rowid作为隐藏的聚集索引
在这里插入图片描述
在这里插入图片描述

思考:

1、以下SQL语句,那个执行效率高?为什么?在这里插入图片描述
当然是第一个效率高;(上图可以进行解释说明为什么)

2、lnnoDB主键索引的B+tree高度为多高呢?
在这里插入图片描述

4、索引的语法

  • 创建索引
create [unique|fulltext] index index_name on table_name (index_col_name....)
  • 查看索引
show index from table_name
  • 删除索引
drop index index_name from table_name

按照下列的需求,完成所有的创建

  1. name字段为姓名字段,该字段的值可能会重复,为该字段创建索引。
  2. phone手机号字段的值,是非空,且唯一的,为该字段创建唯一索引。
  3. 为profession、age、status创建联合索引。
  4. 为email建立合适的索引来提升查询效率。
create index idx_user_name on tb_user(name);

create unique index idx_user_phone on tb_user(phone);

create index idx_user_pro_age_sta on tb_user(profession,age,status);

create index idx_email on tb_user(email);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值