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 时候起的名字

相关推荐
2303_Alpha20 小时前
SpringBoot
笔记·学习
萘柰奈20 小时前
Unity学习----【进阶】TextMeshPro学习(三)--进阶知识点(TMP基础设置,材质球相关,两个辅助工具类)
学习·unity
沐矢羽20 小时前
Tomcat PUT方法任意写文件漏洞学习
学习·tomcat
好奇龙猫20 小时前
日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(10):91-100语法+考え方13
学习
向阳花开_miemie21 小时前
Android音频学习(十八)——混音流程
学习·音视频
工大一只猿21 小时前
51单片机学习
嵌入式硬件·学习·51单片机
c0d1ng21 小时前
量子计算学习(第十四周周报)
学习·量子计算
Hello_Embed1 天前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中1 天前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Magnetic_h1 天前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa