2024-05学习笔记

最近的学习大多都是和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.mzph.cn/news/841082.shtml

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

相关文章

Topk问题以及二叉树的三种层序遍历和基本操作

一、Topk问题 1、问题描述 TOP-K问题&#xff1a;即求数据结合中前K个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大。 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 2、思路 对于Top-K问题&#xff0c;能想到的最简单直接的…

618快到了,送大家一款自动化脚本工具,一起薅羊毛

前言 一年一次的618活动来了&#xff0c;大家做好准备了&#xff0c;奇谈君为大家准备好用的618神器&#xff0c;解放双手&#xff0c;简单操作就可以把红包拿到手。 京淘自动助手 首次使用前需要进行设置 将手机的无障碍权限和悬浮窗权限打开 设置完成后&#xff0c;可以把…

什么是健康信息卡

健康档案信息卡是交由居民本人保管的个人健康信息卡片。 其内容包括&#xff1a;居民个人主要基本信息、健康档案编码、患有的重要疾病、过敏史以及紧急情况下的联系人及联系方式&#xff0c;还有所属基层医疗机构的责任医生、护士及联系电话等。它主要用于居民在复诊、转诊或接…

UTC与GPS时间转换-[week, sow]

UTC与GPS时间转换-[week, sow] utc2gpsgps2utc测试参考 Ref: Global Positioning System utc2gps matlab源码 function res utc2gps(utc_t, weekStart)%% parameterssec_day 86400;sec_week 604800;leapsec 18; % 默认周一为一周的开始if nargin < 2weekStart d…

算法打卡 Day10(栈与队列)-用栈实现队列 + 用队列实现栈

今天开始进入栈与队列啦&#xff01; 文章目录 栈与队列理论基础栈 Leetcode 232-用栈实现队列题目描述解题思路 Leetcode 225-用队列实现栈题目描述解题思路 首先我们来学习一下栈与队列的基础知识~ 栈与队列理论基础 栈与队列的区别是&#xff1a;栈是先进后出&#xff0c…

Python | Leetcode Python题解之第111题二叉树的最小深度

题目&#xff1a; 题解&#xff1a; class Solution:def minDepth(self, root: TreeNode) -> int:if not root:return 0que collections.deque([(root, 1)])while que:node, depth que.popleft()if not node.left and not node.right:return depthif node.left:que.appen…

cnVcXsrv 21.1.13.1—VcXsrv 21.1.13中文版本简单说明~~

对于VcXsrv的使用目的和用途相信大家都很了解。前不久VcXsrv做了更新&#xff0c;并且将项目托管到github上了。链接如下&#xff1a; VcXsrv: Windows X-server based on the xorg git sourceshttps://github.com/marchaesen/vcxsrv也可以简单查看如下链接&#xff1a; VcXs…

在matlab里面计算一组给定参数的方程的解

如&#xff1a; k (1:1024); f (x)(1-x-k.*x.^2); 在这段代码给出了一组函数&#xff0c;若需要计算f0&#xff0c;可以通过自带的函数实现&#xff1a; x0 zeros(length(k),1); options optimoptions(fsolve,Display,none,TolX,tol,TolFun,tol); tic for ik 1:length…

全网讲的最详细的Docker镜像分层存储原理

先说结论&#xff0c;容器镜像分层存储图示 欢迎关注 实验环境准备 当前实验docker版本24.0.7如下&#xff0c;当前docker版本使用overlay2机制存储镜像 Client: Docker Engine - CommunityVersion: 24.0.7API version: 1.43Go version: go1.20.10…

Three.js 研究:2、如何让动画线性运动

1、默认的动画含有加速度并非线性的 制作好的动画很明显是非线性的&#xff0c;这是一个运动环&#xff0c;为了让环运行线性进行如下设置。 2、设置动画成为线性动画

Vue从入门到实战Day07

一、vuex概述 目标&#xff1a;明确vuex是什么&#xff0c;应用场景&#xff0c;优势 1. 是什么&#xff1a; vuex是一个vue的状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;vuex是一个插件&#xff0c;可以帮助我们管理vue通用的数据&#xff08;多组件共享的…

解锁数据关联之道:SQL 表连接详解

文章目录 概述表关系横向连接内连接 inner join左连接 left join右连接 right join全连接 full join交叉连接 cross join 纵向合并UNION ALLUNION 概述 在数据处理、数据分析中常会用到表连接。表连接的作用是将多个表中的数据关联起来&#xff0c;以便在查询过程中获取更全面…

家政项目day2 需求分析(模拟入职后熟悉业务流程)

目录 1 项目主体介绍1.1 项目背景1.2 运营模式1.3 项目业务流程 2 运营端需求2.1 服务类型管理2.2 服务项目&#xff08;服务&#xff09;管理2.3 区域管理2.4 区域服务管理2.5 相关数据库表的管理2.6 设计工程结构2.7 测试接口&#xff08;接口断点查看业务代码&#xff09; 1…

【机器学习与大模型】开源大模型和闭源大模型:技术发展与社会责任的平衡点

目录 &#x1f4a1;引言✈️✈️一&#xff0c;开源大模型的优势与劣势✈️✈️1.1 优势&#xff1a;✈️✈️1.2 挑战和劣势&#xff1a; &#x1f680;&#x1f680;2. 闭源大模型的优势与劣势&#x1f680;&#x1f680;2.1 优势&#xff1a;&#x1f680;&#x1f680;2.2 …

【pyspark速成专家】7_SparkSQL编程1

目录 一&#xff0c;RDD&#xff0c;DataFrame和DataSet对比 二&#xff0c;创建DataFrame 本节将介绍SparkSQL编程基本概念和基本用法。 不同于RDD编程的命令式编程范式&#xff0c;SparkSQL编程是一种声明式编程范式&#xff0c;我们可以通过SQL语句或者调用DataFrame的相…

amis 联动效果触发的几种方式

联动效果实现主要俩种方式: 1.表达式实现联动,基于组件内或数据链的变量变化的联动 比如&#xff1a; "source": "/amis/api/mock2/options/level2?name${name} " (必须是这种字符串拼接形式,在data数据映射中表达式不会触发联动) 所有初始化接口链…

Java进阶学习笔记10——子类构造器

子类构造器的特点&#xff1a; 子类的全部构造器&#xff0c;都会先调用父类的构造器&#xff0c;再执行自己。 子类会继承父类的数据&#xff0c;可能还会使用父类的数据。所以&#xff0c;子类初始化之前&#xff0c;一定先要完成父类数据的初始化&#xff0c;原因在于&…

线程生命周期

创建线程的两种方法 1.继承Thread类 2.实现Runnable接口 线程从创建到消亡分为新建、就绪、运行、阻塞、死亡5种状态。 新建状态 创建一个线程就处于新建状态。此时线程对象已经被分配了内存空间&#xff0c;并且私有数据也被初始化&#xff0c;但是该线程还不能运行。 就…

03-02-Vue组件之间的传值

前言 我们接着上一篇文章 03-01-Vue组件的定义和注册 来讲。 下一篇文章 04-Vue&#xff1a;ref获取页面节点–很简单 父组件向子组件传值 我们可以这样理解&#xff1a;Vue实例就是一个父组件&#xff0c;而我们自定义的组件&#xff08;包括全局组件、私有组件&#xff09;…

足球走地全自动化操作软件实现过程

本次采用selenium实现自动化操作的流程 打开浏览器录入账号密码等待数据请求&#xff08;监听&#xff09;有新数据&#xff0c;进行自动化操作通过homeName搜索&#xff0c;找到对应数据找到对应的类型&#xff08;让、大小…&#xff09;找到对应的盘口输入数量提交 附登录…