mysql 学习14 索引

索引 是一种数据结构

目的是帮助mysql 高效获取数据。

索引结构 - 二叉树,红黑树,Btree,B+tree,mysql B+tree

因此不同的存储引擎 会有不同的 索引结构

二叉树 和 红黑树 的缺点,

Btree 的缺点

引出的 B+tree

mysql中的B+ tree,对于一般的B+tree 有提升

索引结构 -- hash

面试相关:为什么InnoDB存储引擎选择使用B+tree 索引机构?

索引分类

在innoDB 存储引擎中,索引的存储方式

在innoDB 下,聚集索引 和 二级索引 到底如何存放

在innoDB 下,如何通过 聚集索引 和 二级索引 查询数据

我们要通过 select * from user where name = 'Arm'; 查找数据

由于 聚集索引 只能 通过id 查找,因此第一步,我们要通过二级索引 查找 id

通过二级索引查找到id后,在通过聚集索引找到 row,row就是保存的具体的一行数据。

这个过程 叫做 回表查询

思考题

对于 select * from user where id = 10;

查询聚集索引一次就可以找到

对于 select * from user where name = 'Arm';

第一步,我们要通过二级索引 查找 id

通过二级索引查找到id后,在通过聚集索引找到 row,row就是保存的具体的一行数据

要查找两次索引。

结论:因此第一个执行效率高

思考题2:InnoDB 主键索引的B+ tree 高度为多高呢?

要看懂这个 思考题,需要结合前面的 innoDB 的逻辑存储结构一起看

第一个要弄清楚的问题:节点 是放在页中的。

一个节点是存储在 页中的,而 innoDB 一个页的大小为 16K,

换算成字节就是 一个页的大小为 16 * 1024 个字节

那么如果不是叶子节点,一个页能存储多少 键值 和 指针 呢?

对于主键索引,键值 就是我们 的主键的数据类型,int 占用4字节,bigint占用8字节,

innoDB中指针占用 6个字节。

因此对于 非叶子结点,可以存储的 键值 和 指针 大小为:

n * 8 + (n+1)*6 = 16 * 1024; n为键值,n+1 为指针,n计算出来为1170.

即 可以存放的 键值 有1170个,指针为1171个。

如果高度为2,那么 1171 个指针,就会指向 1171个页,而这些页中存放着 叶子结点。

那么1个页 存放多少个叶子结点呢?这里只有假设了,一个页还是 16k,我们假设一行数据大小为1k,那么16k的大小就能放 16 行数据。因此得出 :

1171个页 * 16 行/页 = 18736 行 数据

如果高度是3,

1171 * 1171个页 * 16 行/页 = 21939856行 数据

索引语法

从前面学习到的知识我们了解到,即使我们在create table的时候没有加上索引,mysql会给我们默认的加上索引,那么为什么我们还要学习 索引的语法呢?---为了效率。

如果我们想要优化 sql 语句的执行效率,就需要结合自己创建的 索引 。因此要学习 索引的语法

创建索引

create [unique | fulltext] index index_name on table_name (index_col_name,...);

unique:代表的唯一的,代表该字段是不能重复的,该字段指的是 index_col_name。 或者 index_col_name...

fulltext 代表的是 全文索引,在MySQL中,FULLTEXT索引主要用于加速对文本数据的全文搜索。这种索引类型特别适用于那些需要快速查找包含特定单词或短语的记录的场景。例如,在博客平台中搜索文章标题或内容时,FULLTEXT索引能够显著提高查询效率

index 代表是创建的是 索引

index_name 是我们给 这个索引起的名字

on tablename 是对于那张表

(index_col_name,...) 是我们对于 表中的那个字段建立的索引,有可能是多个字段联合起来创建的索引,如果只有一个字段名字,则叫做单列索引,如果有多个字段组成的,则叫做 组合索引 ,或者 联合索引

查看索引

show index from table_name;

删除索引

drop index index_name on table_name;

index_name: 是我们在create index 时候起的名字

相关推荐
西岸行者6 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意6 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码6 天前
嵌入式学习路线
学习
毛小茛6 天前
计算机系统概论——校验码
学习
babe小鑫6 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习
im_AMBER6 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习