IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL的一些索引类型和回表查询的优化 -> 正文阅读

[大数据]MySQL的一些索引类型和回表查询的优化

聚集索引与非聚集索引

聚集索引的叶子节点就是对应的数据节点,可以直接获取到对应的全部列的数据,而非聚集索引在索引没有覆盖到对应的列的时候需要进行二次查询

主键索引与普通索引

当我们在列上建索引的时候,我们分为两种,当我们在主键建立索引时,我们称之为主键索引;当我们在其他列建立索引的时候,我们称之为普通索引

  1. 如果一个主键被定义了,那么这个主键就是作为聚集索引,即叶子节点存储的是全部列数据
  2. 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引
  3. 如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6字节的列,该列的值会随着数据的插入自增
  4. 自增主键会把数据自动向后插入,避免了插入过程中的聚集索引排序问题。聚集索引的排序,必然会带来大范围的数据的物理移动,这里面带来的磁盘IO性能损耗是非常大的,而如果聚集索引上的值可以改动的话,那么也会触发物理磁盘上的移动,于是就可能出现page分裂,表碎片横生,所以不应该修改聚集索引

回表查询

回表查询就是如果通过普通索引查询,我们会通过这个普通索引的列值找到该记录的主键值(也就是说普通索引的叶子节点里面存的不是某一个记录的所有列的值,存的是它的主键值,如果每个普通索引像聚集索引一样叶子节点存储所有列的值,那么会造成大量的空间浪费)然后拿着这个主键值来到主键索引再查询一遍,这个就叫回表查询,就是普通索引查询
示意图:
在这里插入图片描述

我们应该再int数据类型建立索引还是再char类型建立索引

如果char类型占用的字节比较小,可以考虑在char上建立索引,否则尽量在int上建立索引,因为在B+树上,建立索引的列的值是作为B+树节点的key的,key越大,一个节点的元素数量就会越少,B+树深度就会越深,IO次数就会越多

回表查询的优化

如下情况是不会回表查询的
他select的是id,id是主键,普通索引的叶子节点的value就是存放的是主键,所以不需要回表
在这里插入图片描述
如果在某种特定的情况之下,我们可以使用联合索引(覆盖索引)来避免回表查询
如果有如下表:
在这里插入图片描述

联合索引的创建
在这里插入图片描述
当索引键好了之后,他的B+树大概是如下的样子:
在这里插入图片描述
我们在建联合索引的时候注意
第一列索引是有序的,第二列索引是无序的,因为我们建立索引的时候,我们是先判断第一列的大小,当第一列大小一样的时候,再判断第二列的大小的。
当我们执行如下查询语句时,是不会出现回表查询的,因为我们可以在这个索引里面找到我们要的列
在这里插入图片描述
这里我们需要注意一些索引失效(一般指联合索引)的情况,当我们执行下面这条查询语句的时候时,MySQL是不会走这个联合索引的:因为age是第二列索引,他是无序的
在这里插入图片描述

我们可以认为覆盖索引是一种概念,联合索引是覆盖索引的一种实现
联合索引:指索引中包含多个列。
覆盖索引:指的是从索引中可以得到所有想要查询的列。
比如select id,age from user where name = ‘a’ and age = 12。
联合索引是说的是where后面的部分,即查询条件;覆盖索引是说的select后面的部分,即查询列。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:47:11  更:2022-04-26 11:50:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:46:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码