《MySQL 实战 45 讲》课程学习笔记(四)

news2024/11/18 8:36:29

深入浅出索引

  • 索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。

索引的常见模型

哈希表

  • 哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。
  • 哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。
  • 不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。
    在这里插入图片描述
  • 哈希表这种结构适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL 引擎。

有序数组

  • 有序数组在等值查询和范围查询场景中的性能就都非常优秀。
    在这里插入图片描述
  • 有序数组索引只适用于静态存储引擎。

二叉搜索树

  • 二叉搜索树的特点是:每个节点的左儿子小于父节点,父节点又小于右儿子。
    在这里插入图片描述
  • 为了维持 O(log(N)) 的查询复杂度,你就需要保持这棵树是平衡二叉树。为了做这个保证,更新的时间复杂度也是 O(log(N))。
  • 树可以有二叉,也可以有多叉。多叉树就是每个节点有多个儿子,儿子之间的大小保证从左到右递增。二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。其原因是,索引不止存在内存中,还要写到磁盘上。
  • N 叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了。

InnoDB 的索引模型

  • InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。每一个索引在 InnoDB 里面对应一棵 B+ 树。
  • 根据叶子节点的内容,索引类型分为主键索引和非主键索引。
    • 主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。
    • 非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。
    • 基于非主键索引的查询需要多扫描一棵索引树,即回表。因此,我们在应用中应该尽量使用主键查询。
  • 自增主键的插入数据模式,符合递增插入的场景。
    • 每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。
    • 而有业务逻辑的字段做主键,则往往不容易保证有序插入,这样写数据成本相对较高。
    • 主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。
  • 覆盖索引
    • 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。
  • 最左前缀原则
    • B+ 树这种索引结构,可以利用索引的“最左前缀”,来定位记录。
    • 不只是索引的全部定义,只要满足最左前缀,就可以利用索引来加速检索。
    • 这个最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。
  • 在建立联合索引的时候,如何安排索引内的字段顺序?
    • 第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。
  • 索引下推
    • 索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
    • 在满足语句需求的情况下, 尽量少地访问资源是数据库设计的重要原则之一。
    • 我们在使用数据库的时候,尤其是在设计表结构时,也要以减少资源消耗作为目标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/813923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时序分析:曲线分解

以下仅为博主个人观点,如有错误欢迎批评指正。 前言后记都挺重要建议还是看一下吧。 文章目录 前言经验模态分解EMDEEMDCEEMDAN 变分模态分解VMD 奇异谱分析SSA 后记 前言 本篇文章将会介绍常用曲线分解方法(经验模态分解及其变种,变分模态分解&#x…

集团企业网站建设开发

为集团提供一个互联网上的形象宣传和信息发布、收集的重要平台 利用最新的互联网动态数据库交互能力,建立一套在互联网上具有领先地位的集团网站,将集团和子公司网站做到有机的统一。集团网站不但要把集团的企业、产品等相关信息展示给我们的客户、合作…

RabbitMQ 教程 | 第2章 RabbitMQ 入门

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

1,复杂度和简单排序算法【p2-p3】

复杂度和简单排序算法 1,时间复杂度1.1选择排序1.2冒泡排序1.3异或运算1.3.1性质:1.3.2案例例1例2 1.4插入排序1.5二分法1.5.1在一个有序数组中,找某个数是否存在1.5.2在一个有序数组中,找>某个数最左侧的位置1.5.3局部最小值问…

linux系统编程重点复习--守护进程和线程

复习目标 说出守护进程的特点独立完成守护进程的创建独立实现多个线程的创建独立实现线程的退出和资源回收理解线程同步的思想 1 守护进程 1.1 守护进程介绍 Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或…

通向架构师的道路之Apache整合Tomcat

一、先从J2EE工程的通用架构说起 这是一个通用的Web即B/S工程的架构,它由: Web Server App Server DB Server 三大部分组成,其中: Web Server 置于企业防火墙外,这个防火墙,大家可以认为是…

hugging face下载数据集

开始直接执行这个,下载下来的图片打不开 git clone https://huggingface.co/datasets/diffusers/dog-example 解决办法: 安装git lfs 1. curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash 2. sudo apt…

论文笔记:Adjusting for Autocorrelated Errors in Neural Networks for Time Series

2021 NIPS 原来的时间序列预测任务是根据预测论文提出用一阶自回归误差预测 一阶差分,类似于ResNet的残差思路?记为pred,最终的预测结果

zore-shot,迁移学习和多模态学习

1.zore-shot 定义:在ZSL中,某一类别在训练样本中未出现,但是我们知道这个类别的特征,然后通过语料知识库,便可以将这个类别识别出来。概括来说,就是已知描述,对未知类别(未在训练集中…

Qsys介绍

文章目录 前言一、为什么需要Qsys1、简化了系统的设计流程2、Qsys涉及的技术 二、Qsys真身1、一种系统集成工具2、何为Nios II1、内核架构2、Nios II选型 三、Qsys设计涉及到的软件&工具四、总结五、参考资料 前言 Qsys是Altera下的一个系统集成工具,可用于搭建…

代码随想录算法训练营第三十天 | 单调栈系列复习

单调栈系列复习 每日温度未看解答自己编写的青春版重点题解的代码日后再次复习重新写 下一个更大元素 I未看解答自己编写的青春版重点题解的代码日后再次复习重新写 下一个更大元素II未看解答自己编写的青春版重点题解的代码日后再次复习重新写 接雨水未看解答自己编写的青春版…

idea模块的pom.xml被划横线,不识别的解决办法

目录 问题: 解决办法: 1.打开设置 2. 取消勾选 3.点击确认 4.解决 问题提出: 写shi山的过程中,给模块取错名字了,改名的时候不知道点到了什么,一个模块的pom.xml变成灰色了&#xff0…

3ds MAX粒子系统演示

其他各案例可以在视频中看到: 从左向右依次是: 粒子流源、喷射、雪、超级喷射、暴风雪、粒子阵列、粒子云 粒子系统

小研究 - JVM 垃圾回收方式性能研究(一)

本文从几种JVM垃圾回收方式及原理出发,研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响,并通过最终测试数据对比,给出了不同应用场景下如何选择垃圾回收策略的方法。 目录 1 引言 2 垃圾回收算法 2.1 标记清除法 2.2…

iOS开发-实现获取下载主题配置动态切换主题

iOS开发-实现获取下载主题配置动态切换主题 iOS开发-实现获取下载主题配置更切换主题,主要是通过请求服务端配置的主题配置、下载主题、解压保存到本地。通知界面获取对应的图片及颜色等。 比如新年主题风格,常见的背景显示红色氛围图片、tabbar显示新…

Visual Studio 设置默认编码格式为 UTF-8

1.添加高级保存选项 2.更改编码格式

客户端服务器通过Socket API通信流程 通过源码角度分析 三握手四挥手都过程的状态改变 及 例如accept()connect()具体做了什么

首先我们先说下网络编程API: 数据在网络上通信,通信的双方一个是 客户端, 一个是 服务器 更具体来说,不是 客户端和服务器这两个机器在 经由互联网 进行通信, 而是 客户端上的某一进程 与 服务器端的某一进程 进…

Java 单链表

链表基本介绍 链表在内存中的实际存储结构 链表的逻辑结构 单链表应用实例 代码实现 // 英雄节点,存储了英雄的信息 class HeroNode {public int id; // 英雄编号public String name; // 英雄名字public String nickName; // 英雄昵称public HeroNode next; // 指…

【系统软件01】devtoolset离线安装gcc

【系统软件01】devtoolset离线安装gcc 一、SCL简介二、SCL源安装三、离线下载devtoolset1、Developer Toolset2、下载devtoolset-93、压缩devtoolset-9 三、离线安装devtoolset-9(gcc9.3)1、解压devtoolset-9.tar.gz2、安装devtoolset-9 四、设置环境变量(使用gcc9.3)1、当前窗…

LeetCode547.Number-Of-Provinces<省份问题>

题目: 思路: 连通的部分加起来,然后总的 减去连通的部分。 但是很可惜 只能通过部分 似乎将st[i][j] st[j][i] 改变之后是可行的 但是实际上 1 2 连通后 2 1 确实是不会再加。 但是 2 3却还是在加一遍。 好吧。答案的思路是使用并查集。将…