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

相关推荐
wdfk_prog19 分钟前
构建基于Hexo、Butterfly、GitHub与Cloudflare的高性能个人博客
笔记·学习·github·hexo·blog
shixian103041131 分钟前
Django 学习日志
数据库·学习·sqlite
丰锋ff2 小时前
2013 年真题配套词汇单词笔记(考研真相)
笔记·学习·考研
小小程序媛(*^▽^*)2 小时前
第十二届全国社会媒体处理大会笔记
人工智能·笔记·学习·ai
毕设源码-邱学长3 小时前
【开题答辩全过程】以 爱学习教育网站为例,包含答辩的问题和答案
学习
Yupureki3 小时前
从零开始的C++学习生活 5:内存管理和模板初阶
c语言·c++·学习·visual studio
程序员Aries3 小时前
从零开始实现一个高并发内存池_DayThree:内存池整体框架与ThreadCache、TLS无锁访问
c++·学习·单例模式
Ethan learn English4 小时前
汽车零部件英语词汇 | 3000 最常用单词系列
笔记·学习·汽车·生活·英语·可理解性输入
好奇龙猫4 小时前
日语学习-日语知识点小记-进阶-JLPT-N1阶段应用练习(7):语法 +考え方20+2022年7月N1
学习
charlie1145141914 小时前
Windows 10 系统编程——线程专题1
c++·windows·学习·线程