MYSQL_

2023-09-03 12:46:37

①. 索引的概述

  • ①. 索引是帮助MySQL高效获取数据的排好序的数据结构

  • ②. mysql数据库的实现原理通过b+树实现的,b+树的原理是先找到所有的数据,然后折半找到中间的数据,比它小的放左边,大的放右边,形成一个树的结构,依次去进行折半,然后将剩余的数据再折半
    (索引底层实现原理b+树(二叉树),折半查找)

在这里插入图片描述在这里插入图片描述

②. 二叉树和红黑树

  • ①. 如果我们要查找89这个元素,经过两次IO就可以获取到(二叉树)
    在这里插入图片描述
  • ②. 这个时候我们以Col1为例,如果要查找6,会变成一种链表的形式,从001开始查看一直到006查看到为止(二叉树)

在这里插入图片描述

  • ③. 如果我们的索引底层使用的是红黑树,随着数量的增加,深度会非常大(不采取)
    在这里插入图片描述

③. Hash建立索引结构

  • ①. 在SQL中建立索引的时候,除了可以使用B+树的形式,还可以使用hash的方式
    在这里插入图片描述

  • ②. 对索引的key进行一次hash计算就可以定位出数据存储的位置

  • ③. 很多时候Hash索引要比B+ 树索引更高效

  • ④. 仅能满足 “=”,“IN”,不支持范围查询

  • ⑤. hash冲突问题

在这里插入图片描述

④. B树的数据结构

  • ①. 叶节点具有相同的深度,叶节点的指针为空

  • ②. 所有索引元素不重复

  • ③. 节点中的数据索引从左到右递增排列
    在这里插入图片描述

⑤. MyISAM存储引擎索引实现

  • ①. MyISAM索引文件和数据文件是分离的(非聚集)
    非聚集:如下面的15:0x07,通过这个0x07地址找到数据表中实际的数据,需要有回表的方式

在这里插入图片描述

  • ②. 我们使用MyISAM存储引擎有三种文件生成,第一个frm:表结构、MYD:表数据文件、MYI:表索引文件
    在这里插入图片描述

⑥. InnoDB索引实现(聚集)

  • ①. 聚集索引-叶节点包含了完整的数据记录
  1. 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
  2. 叶子节点包含所有索引字段
  3. 叶子节点用指针连接,提高区间访问的性能

在这里插入图片描述

  • ②. 为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键,而不用UUID?
  1. 如果没有建立主键,那么mysql会默认将建表的语句中的不重复的列作为主键储存b+树,如果所有列都有重复数据,MYSQL会自动创建一个列出来,建立B+树的关系。建立了主键,MYSQL就可以根据主键来展示B+树的数据结构。
  2. 使用UUID能让主键唯一,但是在比较时,数据很大,在底层比的是位,如果我们使用简单的主键自增,一下就比较好
  • ③. 谈谈你对B树和B+树区别?
  1. B+的data和索引全部在叶子节点,这样,可以储存更多的数据
  2. B树和B+树区别二,B+树有用指针链接,B树没有。试想,需要查询大于20的数据,那么B+树就可以根据折半查找找到20这个数据,再根据30储存的箭头找到49、50,依次这样下去。如果换做B树,查找49、50的时候,又需要重新进行扫描全表遍历

在这里插入图片描述

  • ④. 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

在这里插入图片描述

⑦. 联合索引的设定

  • ①. 设置联合索引
    key ‘idx_name_age_position’ (‘name’,‘age’,‘position’) USING BTREE
    在这里插入图片描述
  • ②. 下面的只有第一条使用的索引
explain select * from employee where name='TANGZHI' and age=31;
explain select * from employee where age=30 and position='dev';
explain select * from employee where position='dev';
更多推荐

Codeforces Round 896 (Div. 1) C. Travel Plan(树形dp+组合数学)

题目有一棵n(1<=n<=1e18)个点的树,点i连着2*i和2*i+1两个点,构成一棵完全二叉树对于每个点i,记其值为a[i],a[i]可以取[1,m](1<=m<=1e5)的整数记i到j的简单路径上的最大值为s[i][j],则一棵权值确定的树对答案的贡献是现在求所有可能情况下的树的贡献之和,答案对998244353

手撕 LFU 缓存

大家好,我是方圆。LFU的缩写是LeastFrequentlyUsed,简单理解则是将使用最少的元素移除,如果存在多个使用次数最小的元素,那么则需要移除最近不被使用的元素。LFU缓存在LeetCode上是一道困难的题目,实现起来并不容易,所以决定整理和记录一下。如果大家想要找刷题路线的话,可以参考Github:Leet

数据分析实战│时间序列预测

时间序列预测问题是一类常见的数据分析问题。数据中往往包含时间标签,这类问题往往根据过去一段时间的数据,建立能够比较精确地反映序列中所包含的动态依存关系的数学模型,并对未来的数据进行预测。01、问题描述及数据挖掘目标本案例给出二战时期的某气象站温度记录值,通过分析之前的天气状况来预测将来天气情况。与回归分析模型进行预测不

使用新版Maven-mvnd快速构建项目

目前我们项目的构建方式多数是maven、gradle,但是maven相对gradle来说,构建速度较慢,特别是模块相对较多的时候,构建速度更加明显。但是我们将项目由maven替换为gradle相对来说会比较麻烦,成本较高。于是我们可以选择mvnd来构建项目,可以使得构建项目速度更快,而且项目无需任何改动。1、下载mvn

SCT44160Q国产、车规 3.4-40V 160-mΩ四通道智能高位开关 P2P替代TPS4H160

SCT44160Q国产、车规3.4-40V160-mΩ四通道智能高位开关P2P替代TPS4H160北京冠宇铭通科技有限公司一级代理商描述SCT44160Q器件是全保护的四路通道智能高侧开关,带有四个集成的160-mΩNMOS功率场效应管。对于版本A,设备实现数字故障报告采用开路漏极结构,四通道同步设定电流限值。对于B版

2023年03月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程(1~6级)全部真题・点这里一、单选题(共25题,每题2分,共50分)第1题在启动IDLE后,看到下列哪一个提示字符,表明已经进入PythonShell交互模式?()A:<<<B:>>>C:^^^D:》》》正确的答案是:B:>>>解析:在启动IDLE后,当看到提示字符>>>,表示已经进入PythonSh

Python编辑器和Pycharm的傻瓜式安装部署

给我家憨憨写的python教程有惊喜等你找噢——雁丘Python解释器Pycharm的安装部署关于本专栏一Python编辑器1.1使用命令提示符编写Python程序1.2用记事本编写Python程序二Pycharm的安装三Pycharm的部署四Pycharm基础使用技巧4.1修改主题颜色4.2修改字体4.3快速修改字体

Flask狼书笔记 | 08_个人博客(下)

文章目录8个人博客8.4初始化博客8.5使用Flask-Login管理用户认证8.6CSRFProtect实现CSRF保护8.7编写博客后台小结8个人博客8.4初始化博客1、安全存储密码密码不要以明文的形式直接存储在数据库中,以防被攻击者盗取、泄露。一般的做法是,不存储密码本身,而存储通过密码生成的散列值。(但密码仍然

自然语言处理(扩展学习1):Scheduled Sampling(计划采样)与Teacher forcing(教师强制)

自然语言处理(扩展学习1):ScheduledSampling(计划采样)与2.Teacherforcing(教师强制)作者:安静到无声个人主页作者简介:人工智能和硬件设计博士生、CSDN与阿里云开发者博客专家,多项比赛获奖者,发表SCI论文多篇。Thanks♪(・ω・)ノ如果觉得文章不错或能帮助到你学习,可以点赞👍

linux进程间信号量通信IPC(sem)

一、信号量信号量是一种用于提供不同进程间或一个从给定进程的不同线程间同步手段的原语。1.1、Posix信号量的选择1)单个进程的各个线程共享,可以使用基于内存的信号量。2)彼此无亲缘关系的不同进程需使用信号量时,通常使用有名信号量。1.2、基于内存的信号量的持续性1)如果某个基于内存的信号量是由单个进程的各个线程共享的

【新书推荐】大模型赛道如何实现华丽的弯道超车 —— 《分布式统一大数据虚拟文件系统 Alluxio原理、技术与实践》

文章目录大模型赛道如何实现华丽的弯道超车——AI/ML训练赋能解决方案01具备对海量小文件的频繁数据访问的I/O效率02提高GPU利用率,降低成本并提高投资回报率03支持各种存储系统的原生接口04支持单云、混合云和多云部署01通过数据抽象化统一数据孤岛02通过分布式缓存实现数据本地性03优化整个工作流的数据共享直播预告

热文推荐