2024-05学习笔记

news2024/9/20 18:26:56

最近的学习大多都是和mysql的索引相关的

1.mvcc

mvcc是不需要手动配置,是mysql的一个机制
在事务开启时,对涉及到的数据加一个隐藏列,隐藏列对应的值,就是事务id

如果当前是修改操作,就copy一份原来的数据到新的一行,然后这一行有个隐藏列是事务id  方便回滚

如果是删除  就不用copy了  

2.openfeign也可以通过url方式调用

也能起到负载均衡

但是如果通过指定url的方式,还能否实现负载均衡,我发现有不同说法,个人更倾向于不能实现负载均衡

还可以把url放在yml配置文件中,这样取值

url = "http://${a.url}"

3.踩坑:Mybatis-Plus子类起名注意

使用Mybatis-Plus如果继承了BaseMapper后,注意子类接口方法名不能和BaseMapper中的重复

这个bug我差了半天,我调用了mybatis-plus的java8相关方法delete,但是打印的sql跟我想要的完全无关

 然后点到BaseMapper这个父类,我发现delete方法被重载了,然后这个控制台打印的就是重载的方法,改个名就好了

 查了一下,原来我们眼里的重载,在mybatis-plus眼里是重写,它不支持重载,子类要是重写,他就直接执行子类的方法了。

4.linux怎么看容器端口和宿主机端口

docker ps -a命令中的ports谁是内部端口,docker容器内部端口,谁是宿主机的端口

后边的是docker的,前边的是当前服务器开放出来,我们可以访问的端口

5.\G干嘛的 

linux命令执行mysql相关指令的时候总在结尾加一个\G,没啥别的意思,就是为了让结果集展示的好看一点,换行展示,也相当于一个分号

6.隔离级别和对应的问题

mysql默认隔离级别是可重复读,并且认为可重复读不会产生幻读

7.save point到底干嘛的

与事务回滚相关,save point在一个事务内定义保存点,然后rollback可以指定回滚的时候回滚到哪个保存点,如果不指定,就是整个事务都回滚

8.隐式提交

 这个知识点个人认为不太重要,因为spring如果开启一个新事务,新事务提交或者不提交是不影响原来的事务的

mysql的隐式提交:在commit之前有ddl语句,或者再写个begin 那ddl和begin之前的都会被commit

已经提交了 就无法回滚

9.Atomic无锁编程

自旋

10.数据库字段定义:越小越好

字段优化:越小越快,

比如能用int不用long,long就是bigint

再比如能用char就不用varchar

能用varchar(10)就不选varchar(200),因为mysql会根据长度进行内存分配

 11.数据库中boolean型字段值与返回给前端的字段值

突然好奇想到的,因为之前做的时候,会定义一个枚举,数据库中存字符串YES和NO

所以返回给前端的字段和存在数据库里的字段值相同,不做转换

但是也有人说如图这种

在mysql中定义boolean型,虽然下拉选中有boolean的选项,

但是保存会被保存为tinyint,true是1false是0

然后用mybatis自动生成对应实体时候,建的这个boolean型在实体中也是Integer类型,如果想用截图要求的,需要手动修改

 12.为什么mongo用B树,mysql用B+树

B+树只有叶子节点存储数据,并且数据之间有序,且组成一个链表

B树是每个节点都会存储数据,不管是叶子节点还是非叶子节点

至于选择哪个做底层索引,跟他们自己的业务选型有关,

mongo是非关系型数据库,每条数据之间相关性不大,一般一次也就取一条数据。

所以mongo用B树是为了取单条数据是查询比较快

mysql是关系型数据库,经常需要使用到范围查找,分页查询

所以mysql使用B+树是为了范围取值

b树的每个节点都要存数据,那每个节点可以容纳的子节点路数就会比b+树小 

13.二分查找 

为什么说着索引突然又说到二分查找?

你建立索引,是为了你加快查询速度吧?

那索引又会使用到一种数据结构,B树或者B+树,那这两种数据结构,又是由二叉树衍生过来的。

二叉树又和二分查找相关

平衡二叉树,左右高度差不超过1

B树,其实有点像多个子节点的二叉树,二叉树每个父节点最多两个子节点,但是B树可以多个

二分查找:有序数组,用下标除以二的方式,判断目标数字所在范围

如果奇数的时候,除以二之后可以选择前边那个也可以选择后边那个,这没事没啥影响

14.B+树的数据结构,以及页合并以及分裂

看完这个就知道为什么要合理的建索引,而不是把每个字段都作为索引

如图叶子节点又组成了一个链表

索引对应的数据增加的时候 ,可能发生的变化,比如页分裂

 

索引对应数据删除,可能发生的变化,比如页合并 

 

一个索引就是一棵B+树 (mysql中)

以上,其实索引在数据增加删除的时候是有维护成本的,毕竟使用索引是为了提升系统的运行速度,如果把每个字段都作为索引,维护成本就大大提醒,违背了建立索引的初衷

15.blob和text谨慎使用

blob和text谨慎使用,原因是如果用select * from  然后那这个表里如果有blob和text字段也会返回,那耗费带宽也浪费内存

16.为什么索引会自行排序

这和磁盘读取有关

所以数据分布最好有序 

而且磁盘读取数据,如果你得文件比较小,他不止会读你一个文件 他是一个扇形区域  至少也要把这块扇形区域的都读出来

17.联合索引

看了如图就可以知道,为啥使用联合索引的查询的时候,一定要按照口诀

带头大哥不能死,中间兄弟不能断

因为索引肯定是有序的,他会先按照第一个列排序,第一个列相同的时候,才按照第二个列排序,以此类推,第二个列相同的时候,才会按照第三列排序

如果我搜索的时候直接只用第三个列去搜索,那大概率是无序的,查询速率大大降低

比如Index(a,b,c)  然后我用

select * from table where a=1 b like'%ss' and c=2

结论是只有A用到了索引

那联合索引中a是用到的,b因为左百分号不知道以什么开头,就不确定它在哪个位置,用不到

然后c是在b拍好序的前提下才去排序的,现在b都不确定位置,c就更走不了索引了

 那如果我改成

select * from table where a=1 b like'ss%' and c=2

结论是A,B,C都用到了索引

区别就是b字段换成右百分号了,那这样b就知道以什么开头了,就能按照一定顺序把b的范围找到,这时候b走索引,c也能走索引

当然你如果更改一下顺序,写成

select * from table where c=2 and b like'ss%' and  a=1 

效果是一样的,mysql的sql优化器会自动调整顺序 

 18.一个select中只会用到一个二级索引

这是一个颠覆以前认知的事,就算where中使用了多个二级索引,那最后mysql也只会选择一个,其他的条件再回表之后在结果集中作为筛选条件,而不会走他们的索引树

比如我建立了三个索引,分别是索引A索引B索引C

不是联合索引奥,都是单个的

然后我查询的时候

select * from table where a=1 and b=1 and c=1

那这时候同样会发生回表,不会索引覆盖

为什么呢?

因为mysql最终只会选择一颗B+树

在一棵索引树上找到where条件中这个索引下指定范围的数据,然后回表去主键索引查询所有列,把这个作为结果集,再通过其他的where条件对这个结果集进行筛选

比如 select * from table_A where a<3 and b>2;
a和b都是非聚集索引

那通过Mysql的查询优化器筛选出来哪个索引更快,它就去那个索引树上找 

比如选择了a

那找到a<3那部分数据之后

就拿着这些数据的id去主键索引树,回表查询拿到结果集,再用b>2对这个结果集进行筛选,但是b的那棵索引树他是不走的

19.建立了索引但是依然全表扫面的情况 

比如我分别建立索引expire_time和索引order_note 

如果我用and去查询,那mysql至少会选择一棵索引树,然后回表去筛选另一个条件

但是如果我用OR去查询,那Mysql就没办法选择索引树,直接全表扫描

为什么?

因为OR取并集,只筛选一棵的话,没办法确定另一棵的范围

20.选择什么样的字段作为索引

选择离散型高的,比如性别和名字这两个字段,那就选择名字作为索引,而不是选择性别

因为索引是要排序的,排好序之后,定位快,搜索快

如果选择性别,一共就俩,排不排序,没啥意义

 

 21.前缀索引

 

 

 22.什么情况下要创建索引

1.表连接

2.group by,order by 

 

 多列索引,就是联合索引

 

 索引覆盖,不用回表

23.设计表结构时,尽量不为NULL

mysql认为每个null都是独一无二的  所以如果索引字段,存入的值有null,那么每个null值都会占用索引树的一部分空间
当查询where 字段 is null时,会得到一个范围  而不是像where 字段=1 这种只获得一条数据

可以默认0或者空字符串 

24. 查询优化

我们经常说减少与数据库的交互,但是真到需要优化的时候,如果之前的sql又臭又长,执行很慢,然后把他拆分了反倒快了,那就哪个快用哪个,东西是死的人是活的。多交互也没办法

 

 这个也是可以酌情增加与数据库交互次数

本来关联5个表,然后查询很慢,那我分解为俩sql,一个是关联3个,一个是关联两个

在代码层面再去处理

反正哪个快用哪个

 

 这些优化没有非黑即白得,就是看怎么快就怎么调整

  25.从索引上来讲,主键最好不要用uuid

如果是自增主键,那插入的时候在最后的索引节点进行操作就行

但如果用uuid,就很有可能发生新增的主键放在索引的中间位置,后边的就得重新挪位置

26.执行计划

 查询多个表的时候可能出现多条执行计划

 

 

 type为const这种情况基本是最好的

所谓全表扫描,就是遍历整棵主键索引树 

因为主键索引存储所有数据

使用inner join时,mysql的优化器会根据效率,选择一个主表,比如A,B内连接,A只有十条数据,B有一千条,那就把A作为主表,去关联B,取交集,缩小范围

但使用外连接时,写sql时就注定了哪个表为主表,所以在写sql时候要注意这个优化,把数据少,能筛选掉大多数数据的表作为主表,缩小查询范围 

 范围查询:in  between >  < 都是范围扫描

27.索引覆盖的另一种情况

expire是联合索引最后一列,正常逻辑来讲应该是不走索引的

但是这个sql的结果集和条件,刚好都在联合索引那棵树上,然后mysql就直接扫描那棵B+树,这样成本比全表扫描低,也不用回表了

问题引申:为啥他不在主键索引上找?

1.where条件中没用到主键索引

2.全表扫描说的就是把主键索引从头到脚扫一边

3.主键索引存储了这个表的所有字段,数据量太大

 

 执行计划是这样显示的

possible_key是可能用到的索引,key是真正用到的索引,正常来讲,key是possible_key的子集

但是这个不是

因为mysql做出如上分析之后,会选择效率最高的一种

 28.执行计划的其他参数

key_len:索引长度

 ref:关联查询是被连接的字段

 rows:扫描的行数

 filtered:最终结果树跟扫描行数的比例,所占百分比

28.1 Extra

执行计划的最后一个字段 

 using index:索引覆盖

 索引下推:如图举例

 useing where:只能说明用了where,别的啥也说明不了

 

not exist:查询条件与建表定义相反

比如有个字段我建表的时候就定义为not null

然后查询的时候我非得查询这个字段is null 

 using filesort:排序字段不是索引字段

fielsort时候 也需要优化

冷知识:mysql会在group by的时候自动按照被group by的字段顺序进行order by字段排序

要是不想排序,就得加上order by null

using temp:创建了临时表

出现这个的时候,是比较不好的一个情况,考虑优化

当执行计划中出现临时表这种情况,代表执行比较慢,因为临时表需要建立和维护

 

 

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

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

相关文章

Atlas 200 DK(Model 3000)安装MindSpore Ascend版本

一、参考资料 mindspore快速安装 二、重要说明 经过博主多次尝试多个版本&#xff0c;Atlas 200 DK&#xff08;Model 3000&#xff09;无法安装MindSpore Ascend版本。 三、准备工作 1. 测试环境 设备型号&#xff1a;Atlas 200 DK(Model: 3000) Operating System Vers…

【Go专家编程——内存管理——内存分配】

1.内存分配 1.1 基础概念 编写过C语言的读者一定指导malloc()函数用于动态申请内存&#xff0c;其中内存分配器使用glic提供的ptmalloc2。 内存分配器 c语言的ptmalloc2google的tcmallocfacebook的jemalloc后两者在避免内存碎片和性能上均比glibc有较大优势&#xff0c;在多…

VBA即用型代码手册:删除Excel中空白行Delete Blank Rows in Excel

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

HTTP响应的基本概念

目录 HTTP响应中的一些信息 HTTPS HTTP响应中的一些信息 状态码&#xff1a;描述了这次HTTP请求是否成功&#xff0c;以及失败的原因。 1&#xff09;200 ---OK 表示这次访问成功了。 2&#xff09;404 ---Not Found 表示客户端请求的资源在服务器这边不存在。 3&a…

93.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-增强技能信息显示后进行分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

Pytorch深度学习实践笔记3

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 视频来自【b站刘二大人】 目录 1 梯度下降&#…

html简述——part1

HTML概述 HTML&#xff08;HyperText Markup Language&#xff09;是一种用于创建网页的标准标记语言&#xff0c;具体指超文本标记语言。它不是一种编程语言&#xff0c;而是一种标记语言&#xff0c;用于描述网页的结构和内容。通过HTML&#xff0c;开发者可以定义网页的标题…

【算法】递归、搜索与回溯——简介

简介&#xff1a;递归、搜索与回溯&#xff0c;本节博客主要是简单记录一下关于“递归、搜索与回溯”的相关简单概念&#xff0c;为后续算法做铺垫。 目录 1.递归1.1递归概念2.2递归意义2.3学习递归2.4写递归代码步骤 2.搜索3.回溯与剪枝 递归、搜索、回溯的关系&#xff1a; …

广告圈策划大师课:活动策划到品牌企划的深度解析

对于刚接触营销策划的新人来说&#xff0c;在这个知识密集型行业里生存&#xff0c;要学习非常多各种意思相近的概念&#xff0c;常常让人感到头疼&#xff0c;难以区分。 这里对这些策划概念进行深入解析&#xff0c;帮助您轻松理清各自的含义和区别。 1. 活动策划&#xff…

CCF20230901——坐标变换(其一)

CCF20230901——坐标变换&#xff08;其一&#xff09; #include<bits/stdc.h> using namespace std; int main() {int n,m,x[101],y[101],x1[101],y1[101];cin>>n>>m;for(int i0;i<n;i)cin>>x1[i]>>y1[i];for(int j0;j<m;j)cin>>x[…

PD协议:引领电子设备充电新时代

随着科技的飞速发展&#xff0c;电子设备已成为我们日常生活中不可或缺的一部分。然而&#xff0c;这些设备的充电问题一直困扰着广大用户。传统的充电方式不仅效率低下&#xff0c;而且存在着安全隐患。为了解决这一问题&#xff0c;USB Implementers Forum&#xff08;USB-IF…

IPv6 地址创建 EUI-64 格式接口 ID 的过程

IPv6 接口标识符 IPv6 地址中的接口标识符&#xff08;ID&#xff09;用于识别链路上的唯一接口&#xff0c;有时被称为 IPv6 地址的 “主机部分”。接口 ID 在链路上必须是唯一的&#xff0c;始终为 64 位长&#xff0c;并且可以根据数据链路层地址动态创建。 MAC 地址 中的…

【C++项目】实时聊天的在线匹配五子棋对战游戏

目录 项目介绍 开发环境 核心技术 项目前置知识点介绍 Websocketpp 1. WebSocket基本认识 2. WebSocket协议切换原理解析 3. WebSocket报文格式 4. Websocketpp介绍 5. 搭建一个简单WebSocket服务器 JsonCpp 1. Json格式的基本认识 2. JsonCpp介绍 3. 序列化与反序…

在ubuntu中关于驱动得问题:如何将nouveau驱动程序加入黑名单和安装NVIDIA显卡驱动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、nouveau驱动程序加入黑名单二、安装NVIDIA显卡驱动 一、nouveau驱动程序加入黑名单 (1) 打开黑名单列表文件 终端输入&#xff1a; sudo gedit /etc/modprobe…

CCF20230501——重复局面

CCF20230501——重复局面 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n;cin>>n;char a[101][64];int i,j;for(i0;i<n;i){for(j0;j<64;j){cin>>a[i][j];}}int temp0,flag1;for(i0;i<n;i){flag1;for(j0;j<…

Linux程序开发(十二):线程与多线程同步互斥实现抢票系统

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

Mongodb分布式id

1、分布式id使用场景 分布式ID是指在分布式系统中用于唯一标识每个元素的数字或字符串。在分布式系统中&#xff0c;各个节点或服务可能独立运行在不同的服务器、数据中心或地理位置&#xff0c;因此需要一种机制来确保每个生成的ID都是全局唯一的&#xff0c;以避免ID冲突。 …

Pytorch线性模型(Linear Model)

基本步骤 ①首先准备好数据集&#xff08;DataSet&#xff09; ②模型的选择或者设计&#xff08;Model&#xff09; ③进行训练&#xff08;Train&#xff09;大部分模型都需要训练&#xff0c;有些不需要。这一步后我们会确定不同特征的权重 ④推理&#xff08;inferring…

就业班 第三阶段(ELK) 2401--5.20 day1 ELK 企业实战 ES+head+kibana+logstash部署(最大集群)

ELKkafkafilebeat企业内部日志分析系统 1、组件介绍 1、Elasticsearch&#xff1a; 是一个基于Lucene的搜索服务器。提供搜集、分析、存储数据三大功能。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff…

学习单向链表带哨兵demo

一、定义 在计算机科学中&#xff0c;链表是数据元素的线性集合&#xff0c;其每个元素都指向下一个元素&#xff0c;元素存储上并不连续。 1.可以分三类为 单向链表&#xff0c;每个元素只知道其下一个元素是谁 双向链表&#xff0c;每个元素知道其上一个元素和下一个元素 …