MySQL数据库进阶知识(二)《索引》

学习目标:

  • 掌握MySQL数据库的索引知识

学习内容:

一、索引概述

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

  • 演示
    在这里插入图片描述

  • 优缺点
    在这里插入图片描述

二、索引结构

在这里插入图片描述
MySQL的索引是在存储引擎层实现的,不同的存储引擎具有不同的结构,主要包含以下几种:
在这里插入图片描述
在这里插入图片描述
我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。

  • 二叉树
    在这里插入图片描述
    二叉树缺点:顺序插入时,会形成一个链表,查询性能大大降低。大数据情况下,层级较深,检索速度慢。
    红黑树:大数据情况下,层级较深,检索速度慢。
  • B-Tree(多路平衡查找树)
    以一颗最大度数(max-degree)为5(5阶)的b-tree为例(每个节点最多存储4个key,5个指针):
    在这里插入图片描述
    数的度数指的是一个节点的子节点个数。
    具体动态变化的过程可以参考网站: https://www.cs.usfca.edu/~galles/visualization/BTree.html
  • B+Tree
    在这里插入图片描述
    以一颗最大度数(max-dgree)为5(5阶)的B+tree为例:
    在这里插入图片描述

相对于B-Tree区别:
(1)所有数据都会出现在叶子节点
(2)叶子节点形成一个单向链表

  • Hash
    哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。
    如果两个或多个键值,映射到同一相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。
    (1)hash索引特点
    hash索引只能用于对等比较(=,in),不支持范围查询(between,>,<,……)。
    无法使用索引完成排序操作。
    查询效率高,通常只需要一次检索就可以了,效率通常高于B+Tree索引。
    (2)存储引擎支持
    在mysql中,支持hash索引的是memory引擎,而InnoDB中具有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。
  • 思考:为什么InnoDB存储引擎选择使用B+Tree索引结构?
    (1)相对于二叉树,层级更少,搜索效率更高;
    (2)对于B-tree,无论是叶子节点还是非叶子节点都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;
    (3)相对于hash索引,B-tree支持范围匹配及排序操作。

三、索引分类

在这里插入图片描述
在InnoDB存储引擎中,根据索引的存储形式,又可分为以下2种:
在这里插入图片描述
聚集索引选取规则:
(1)如果存在主键,主键索引就是聚集索引。
(2)如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引
(3)如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。
在这里插入图片描述
在这里插入图片描述

  • 思考:
    (1)以下SQL语句,哪个执行效率高?
    在这里插入图片描述
    (2)在这里插入图片描述

四、索引语法

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

按照以下要求,完成索引的创建
源数据:

create table tb_user(
   id int primary key auto_increment comment '主键',
   name varchar(50) not null comment '用户名',
   phone varchar(11) not null comment '手机号',
   email varchar(100) comment '邮箱',
   profession varchar(11) comment '专业',
   age tinyint unsigned comment '年龄',
   gender char(1) comment '性别 , 1: 男, 2: 女',
   status char(1) comment '状态',
   createtime datetime comment '创建时间'
) comment '系统用户表';


INSERT INTO itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) VALUES ('吕布', '17799990000', 'lvbu666@163.com', '软件工程', 23, '1', '6', '2001-02-02 00:00:00');
INSERT INTO itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) VALUES ('曹操', '17799990001', 'caocao666@qq.com', '通讯工程', 33, '1', '0', '2001-03-05 00:00:00');
INSERT INTO itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) VALUES ('赵云', '17799990002', '17799990@139.com', '英语', 34, '1', '2', '2002-03-02 00:00:00');
INSERT INTO itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) VALUES ('孙悟空', '17799990003', '17799990@sina.com', '工程造价', 54, '1', '0', '2001-07-02 00:00:00');
INSERT INTO itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) VALUES ('花木兰', '17799990004', '19980729@sina.com', '软件工程', 23, '2', '1', '2001-04-22 00:00:00');
INSERT INTO itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) VALUES ('大乔', '17799990005', 'daqiao666@sina.com', '舞蹈', 22, '2', '0', '2001-02-07 00:00:00');
INSERT INTO itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) VALUES ('露娜', '17799990006', 'luna_love@sina.com', '应用数学'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值