当前位置: 首页 > news >正文

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,...) 是我们对于 表中的那个字段建立的索引,有可能是多个字段联合起来创建的索引


http://www.mrgr.cn/news/90080.html

相关文章:

  • 【英语】考研、四六级形近词
  • 设置IDEA的内存大小,让IDEA更流畅: 建议设置在 2048 MB 及以上
  • 【02】RUST项目编译(Cargo使用)
  • LIMO:上海交大的工作 “少即是多” LLM 推理
  • 【漫话机器学习系列】087.常见的神经网络最优化算法(Common Optimizers Of Neural Nets)
  • 大数据项目2a:基于spark的电影推荐和分析系统设计与实现
  • 【滑动窗口与双指针】学习记录
  • 免费为企业IT规划WSUS:Windows Server 更新服务 (WSUS) 之更新组策略(五)
  • python学opencv|读取图像(六十)先后使用cv2.erode()函数和cv2.dilate()函数实现图像处理
  • PHP中的魔术方法
  • 在请求时打印出实际代理的目标地址
  • 机器学习分类整理【表格版】分类角度、名称、概念、常见算法、典型案例
  • 数据结构之排序
  • 线程上下文-ThreadLocal原理
  • 百度高德地图坐标转换
  • 网络防御高级02-综合实验
  • vue学习5
  • win10 llamafactory模型微调相关① || Ollama运行微调模型
  • 网络计算机的相关概念整理
  • FreeRTOS实战项目——STM32F103ZET6智能门禁系统(二)