- 博客(73)
- 资源 (5)
- 收藏
- 关注
原创 MySQL的执行原理之查询重写规则(二)
这个查询表明我们想要将(SELECT m2FROM e2)这个子查询的结果作为外层查询的IN语句参数,整个查询语句的意思就是我们想找e1表中的某些记录,这些记录的m1列的值能在e2表的m2列找到匹配的值。这里可以把子查询的查询结果当作是一个表,子查询后边的AS t表明这个子查询的结果就相当于一个名称为t的表,这个名叫t的表的列就是子查询结果中的列,比如例子中表t就有两个列:m列和n列。如果子查询可以单独运行出结果,而不依赖于外层查询的值,我们就可以把这个子查询称之为不相关子查询。
2024-07-24 09:30:17
493
原创 MySQL的执行原理之查询重写规则(一)
对于一些执行起来十分耗费性能的语句,MySQL还是依据一些规则,竭尽全力的把这个很糟糕的语句转换成某种可以比较高效执行的形式,这个过程也可以被称作查询重写。
2024-07-24 09:27:20
488
原创 MySQL的执行原理之查询成本详解(二)
1、单次查询驱动表的成本2、多次查询被驱动表的成本(具体查询多少次取决于对驱动表查询的结果集中有多少条记录)对驱动表进行查询后得到的记录条数称之为驱动表的 扇出 (英文名:fanout)。很显然驱动表的扇出值越小,对被驱动表的查询次数也就越少,连接查询的总成本也就越低。假设使用s1表作为驱动表,很显然对驱动表的单表查询只能使用全表扫描的方式执行,驱动表的扇出值也很明确,那就是驱动表中有多少记录,扇出值就是多少。
2024-07-23 09:14:36
608
原创 MySQL的执行原理之查询成本详解(一)
MySQL执行一个查询可以有不同的执行方案,它会选择其中成本最低,或者说代价最低的那种方案去真正的执行查询。I/O成本我们的表经常使用的MyISAM、InnoDB存储引擎都是将数据和索引都存储到磁盘上的,当我们想查询表中的记录时,需要先把数据或者索引加载到内存中然后再操作。这个从磁盘到内存这个加载的过程损耗的时间称之为I/O成本。CPU成本读取以及检测记录是否满足对应的搜索条件、对结果集进行排序等这些操作损耗的时间称之为CPU成本。对于InnoDB存储引擎来说,页是磁盘和内存之间交互的基本单位。
2024-07-23 09:10:52
554
原创 MySQL的执行原理刨析(二)
为了方便讲述,我们建立两个简单的演示表并给它们写入数据:连接的本质就是把各个连接表中的记录都取出来依次匹配的组合加入结果集并返回给用户。所以我们把e1和e2两个表连接起来的过程如下图所示:这个过程看起来就是把e1表的记录和e2的记录连起来组成新的更大的记录,所以这个查询过程称之为连接查询。连接查询的结果集中包含一个表中的每一条记录与另一个表中的每一条记录相互匹配的组合,像这样的结果集就可以称之为笛卡尔积。
2024-07-22 17:30:33
841
原创 MySQL的执行原理刨析(一)
我们前边说过MySQL在一般情况下执行一个查询时最多只会用到单个二级索引,但存在有特殊情况,在这些特殊情况下也可能在一个查询中使用到多个二级索引,MySQL中这种使用到多个索引来完成一次查询的执行方法称之为:索引合并/index merge,具体的索引合并算法有下边三种。
2024-07-22 17:28:21
907
原创 史上最完善最体系的MySQL MVCC解析
1、如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。2、如果被访问版本的trx_id属性值小于ReadView中的min_trx_id值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以该版本可以被当前事务访问。
2024-07-17 11:18:50
855
原创 史上最全的MySQL事务解析
事务B前后两次读取同⼀个范围的数据,在事务B两次读取的过程中事务A新增了数据,导致事务B后⼀ 次读取到前⼀次查询没有看到的⾏。在上面我们说过事务有一个称之为隔离性的特性,理论上在某个事务对某个数据进行访问时,其他事务应该进行排队,当该事务提交之后,其他事务才可以继续访问这个数据,这样的话并发事务的执行就变成了串行化执行。连老师借给李老师生活费,借了两次,每次都是1000,连老师的卡里开始有10000,李老师的卡里开始有500,从理论上,借完后,连老师的卡里有8000,李老师的卡里应该有2500。
2024-07-17 11:14:08
962
原创 史上最实用的MySQL调优策略(二)
有了慢查询语句后,就要对语句进行分析。一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,我们需要搞懂EPLATNEXPLAIN的各个输出项都是干嘛使的,从而可以有针对性的提升我们查询语句的性能。
2024-07-15 20:06:51
984
原创 史上最实用的MySQL调优策略
慢查询日志,顾名思义,就是查询花费大量时间的日志,是指mysql记录所有执行超过long_query_time参数设定的时间阈值的SQL语句的日志。该日志能为SQL语句的优化带来很好的帮助。默认情况下,慢查询日志是关闭的,要使用慢查询日志功能,首先要开启慢查询日志功能。如何开启,我们稍后再说。2.1.1慢查询基础-优化数据访问查询性能低下最基本的原因是访问的数据太多。大部分性能低下的查询都可以通过减少访问的数据量的方式进行优化。
2024-07-15 19:59:16
1101
原创 MySQL数据库基础知识必知会(二)
在磁盘设备上,通过B+树可以有效的存储数据;所有记录都存储在叶子节点上,非叶子(non-leaf)存储索引(keys)信息;而且记录按照索引列的值由小到大排好了序。B+树含有非常高的扇出(fanout),通常超过100,在查找一个记录时,可以有效的减少IO操作;*扇出:是每个索引节点(Non-LeafPage)指向每个叶子节点(LeafPage)的指针;*扇出数 = 索引节点(Non-LeafPage)可存储的最大关键字个数 + 1。
2024-07-12 10:34:07
770
原创 MySQL数据库基础知识必知会(一)
范式来自英文Normal Form,简称NF。实际上你可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。
2024-07-12 10:31:28
546
原创 从零开始刨析MySQL调优策略(二)
这一点,也是针对联合索引来说的,前面我们反复强调过,所有记录都是按照索引列的值从小到大的顺序排好序的,而联合索引则是按创建索引时的顺序进行分组排序。比如:由于B+树中的数据页和记录是先按insert_time列排序的,所以我们上边的查询过程其实是这样的:找到insert_time值为'2021-03-22 18:23:42' 的记录。找到insert_timee值为'2021-03-22 18:35:00'的记录。
2024-07-11 11:08:22
1000
原创 从零开始刨析MySQL调优策略(一)
慢查询日志,顾名思义,就是查询花费大量时间的日志,是指mysql记录所有执行超过long_query_time参数设定的时间阈值的SQL语句的日志。该日志能为SQL语句的优化带来很好的帮助。默认情况下,慢查询日志是关闭的,要使用慢查询日志功能,首先要开启慢查询日志功能。如何开启,我们稍后再说。2.1.1慢查询基础-优化数据访问查询性能低下最基本的原因是访问的数据太多。大部分性能低下的查询都可以通过减少访问的数据量的方式进行优化。
2024-07-11 11:05:32
1114
原创 MySQL体系架构解析
MySQL变种有好几个,主要有三个久经考验的主流变种:Percona Server,MariaDB和 Drizzle。它们都有活跃的用户社区和一些商业支持,均由独立的服务供应商支持。同时还有几个优秀的开源关系数据库,值得我们了解一下。
2024-07-10 11:10:10
968
原创 MySQL8新特性解析
一个staff表,里面有id,有name还有一个 m_id,这个是对应的上级id。数据如下:如果我们想查询出每一个员工的上下级关系,可以使用以下方式递归CTE:union ALL使用通用表表达式的好处就是上下级层级就算有4,5,6甚至更多层,都可以帮助我们遍历出来,而老的方式的写法SQL语句就要调整。
2024-07-10 10:22:50
845
原创 MySQL-InnoDB引擎底层解析
InnoDB的内存结构和磁盘存储结构图总结如下:其中的Insert/Change Buffer主要是用于对二级索引的写入优化,Undo空间则是undo日志一般放在系统表空间,但是通过参数配置后,也可以用独立表空间存放,所以用虚线表示。
2024-07-09 16:32:51
612
原创 模型泛化与工程技巧-模型评估
F1_score,在理想情况下,我们希望模型的精确率越高越好,同时召回率也越高越好,但是,现实情况往往事与愿违,在现实情况下,往往出现一个值升高,另一个值降低,有一个指标来综合考虑精确率和召回率,这个指标就是F值。召回率(Recall)的定义为:对于给定测试集的某一个类别,样本中的正类有多少被分类模型预测正确召回率的定义为:对于给定测试集的某一个类别,样本中的正类有多少被分类模型预测正确;Lift图衡量的是,与不利用模型相比,模型的预测能力“变好”了多少,lift(提升指数)越大,模型的运行效果越好。
2024-07-09 16:03:26
323
原创 模型泛化与工程技巧-模型泛化
过拟合(Overfitting):模型过于紧密或精确地匹配特定数据集,以致于无法良好地拟合其他数据或预测未来的观察结果的现象。通俗的来讲,就是训练的模型在训练集上的精确度很高,但是在测试集上的精确度却很差的现象。选择合适的网络结构,通过减少网络层数、神经元个数、全连接层数等降低网络容量。简化模型的另一个好处是能让模型更轻便,训练速度更快,运行速度也会更快。采集更多数据 数据增强&噪声数据 重采样 生成数据。调整损失函数或训练过程中模型运行的方式。
2024-07-09 15:56:08
263
原创 第一次构建一个对话机器人流程解析(二)
'''我的第一个flask_service.py'''#初始化一个flask'''我的第一个send.py'''question = '你好啊,我的第一个flask'data = {#service#globalif '是谁' in question or '关系' in question:try:except:# except:# answer = '对不起啊,小智无法解决这个问题'
2024-07-08 18:29:19
362
原创 第一次构建一个对话机器人流程解析(一)
在此处,基于余弦相似度,对用户的提问和已有语料的提问进行匹配,若匹配成功,则表明用户提问与现有语料中有高度相似的提问,从而返回该提问对应的回答。线上推理时,一般会判断是否是有关于机器人属性的提问,从而进行回答 此处使用模板匹配,进行问题搜索,匹配成功则返回相关的答案。在实现过程中,此处使用一个xml配置文件,配置了机器人的个人年龄、性别、职业等内容,同时包含常见有关于机器人属性的问答。通过这种余弦相似度的匹配,可以构建一个简易的对话系统,但并不准确,且当语料很庞大时,这样的计算是很可怕的,而且准确率很差。
2024-07-08 18:19:12
495
原创 Redis基本命令源码解析-有序集合相关命令
如果元素不存在,如果不是xx,则在skiplist中插入节点,在dict中添加kv。如果值对象编码是ziplist,如果元素存在,如果是nx,则标志为不操作返回。如果是incr,则累加分值,如果分值变化了,则删除跳跃表节点并插入新节点。从db中根据key获得值对象,如果值对象是空或类型不是zset,则返回。从db中根据key获得值对象,如果值对象是空或类型不是zset,则返回。从db中根据key获得值对象,如果值对象是空或类型不是zset,则返回。
2024-07-07 11:27:41
740
原创 Redis基本命令源码解析-字符串命令
incrby key incr 调用incrbyCommand-->调用incrDecrCommand(incr)decr key 调用decrCommand-->调用incrDecrCommand(-1)incr key 调用incrCommand-->调用incrDecrCommand(1)如果nx=1,则要在db中查找所有的key,只要有一个key存在,则不能设置。或者增加的值>0并且原值>0并且增加的值>最大值,则响应值溢出并返回。如果值对象不存在,如果value为空,则响应0并返回。
2024-07-07 11:09:12
977
原创 深入刨析Redis存储技术设计艺术(二)
int hz;int sofd;int dbnum;int aof_fd;*/*//* ACLs */char *configfile:配置文件绝对路径int hz:serverCron的执行频次。
2024-07-05 09:51:56
1107
原创 深入刨析Redis存储技术设计艺术(一)
encoding:4bit,表示value内部存储的编码 10大编码 String: raw(0)、int(1)、embstr(8) hash: ht(2)、zipmap(3)、ziplist(5) list: quicklist(9) zet: intset(6)、ziplist(5) zset: skiplist(7) stream: listpack(10)如果是idletime key,则查找该键的robj对象,如果是lfu淘汰策略,则响应错误。
2024-07-05 09:43:50
1045
原创 深入解析RocketMQ的存储设计艺术(二)
零拷贝(英语: Zero-copy) 技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。➢零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率➢零拷贝技术减少了用户进程地址空间和内核地址空间之间因为上:下文切换而带来的开销可以看出没有说不需要拷贝,只是说减少冗余[不必要]的拷贝。
2024-07-04 11:14:11
846
原创 深入解析RocketMQ的存储设计艺术(一)
deletePhysicFilesInterval:删除物理文件的时间间隔(默认是100MS),在一次定时任务触发时,可能会有多个物理文件超过过期时间可被删除,因此删除一个文件后需要间隔deletePhysicFilesInterval这个时间再删除另外一个文件,由于删除文件是一个非常耗费IO的操作,会引起消息插入消费的延迟(相比于正常情况下),所以不建议直接删除所有过期文件。ConsumeQueue 是消息的逻辑队列,类似数据库的索引文件,存储的是指向物理存储的地址。messageId是全局唯一的。
2024-07-04 10:57:28
1063
原创 深入理解RocketMQ安装教程
编译成功之后,cmd命令进入‘target’文件夹,执行‘java -jar rocketmq-console-ng-2.0.0.jar’,启动‘rocketmq-console-ng-2.0.0.jar’。进入‘\rocketmq-externals\rocketmq-console’文件夹,执行‘mvn clean package -Dmaven.test.skip=true’,编译生成。打开‘MQ文件夹\bin’下的runbroker.cmd,然后将‘%CLASSPATH%’加上英文双引号。
2024-07-03 17:11:46
687
原创 详解NIO与零拷贝的艺术
零拷贝是服务器网络编程的关键,任何性能优化都离不开。在 Java 程序员的世界,常用的零拷贝有 mmap 和 sendFile。那么,他们在 OS 里,到底是怎么样的一个的设计?本文将简单聊聊 mmap 和 sendFile 这两个零拷贝。
2024-06-16 11:26:10
1082
原创 基于SpringBoot+Spark搭建本地计算引擎服务
本文只是描述搭建的主要流程,也为大家提供一个思路。如果想要了解详细的搭建留存请联系我哦。
2024-06-16 11:25:16
496
原创 Redis配置文件参数详解
17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
2024-06-14 16:22:06
757
原创 单体架构改造为微服务架构之痛点解析
但是这种划分逻辑会出现这样的情况:门店服务的开发人员很忙,没空接这个需求,而商品服务的开发人员刚好有空,但他们对门店服务的逻辑不了解。这就需要看这个功能由哪条业务线的产品负责人负责了,比如,由商品系统的产品经理负责,就把它放在商品服务中;根据前面产品从属原则的划分逻辑,特定门店特定商品的上架功能放在门店服务中,因为特定商品由门店的运营人员负责上架。这里的“进”指的是供应商的采购,“销”指的是门店的销售单,“存”指的是一些中央仓库的库存,且进销存供应链系统与新零售系统之间紧密结合,对应的架构图。
2024-06-12 15:58:55
1209
1
原创 实际生产环境JVM性能优化案例分析
这种系统一般至少需要三四台机器去支撑,假设我们部署了三台机器,也就是每台机器每秒大概处理100单,也就是每秒大概有100个订单对象在堆空间的新生代内生成,一个订单对象的大小跟里面的字段多少及类型有关,比如int类型的订单id和用户id等字段,double类型的订单金额等,int类型占用4字节,double类型占用8字节,粗略估计一个订单对象大概是1KB,也就是说每秒会有100KB的订单对象分配在新生代内,如图所示。如果线程数为10,准备时长为2,那么需要2秒启动10个线程,也就是每秒启动5个线程。
2024-04-29 15:58:32
1106
原创 深度刨析JVM垃圾收集的艺术
运行的程序中,当一个对象没有任何指针指向它时,它就会被视为垃圾。由此可以看出,判断一个对象是否为垃圾对象的关键标准就是是否有指针指向它。当一个对象没有任何指针指向它时,即说明该对象不再被引用。如果一个对象不被引用之后还继续留在内存中,被占用的空间也无法被其他对象使用,如果这些垃圾对象所占用的空间一直保留至程序结束,随着垃圾对象越来越多,将可能导致内存溢出。对这种垃圾对象的清理就类似于我们熟悉的磁盘碎片整理,通过定时清理磁盘中的垃圾碎片,可以有效提升空间利用率。
2024-04-29 10:30:33
436
原创 JAVA对象的实例化内存布局与访问定位刨析
意思是所有用过的内存在一边,空闲的内存在另外一边,中间放着一个指针作为分界点的指示器,分配内存就仅仅是把指针向空闲那边挪动一段与对象大小相等的距离罢了。意思是虚拟机维护了一个列表,记录哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的内容。将对象的所属类(即类的元数据信息)、对象的HashCode、对象的GC信息、锁信息等数据存储在对象头中。它是对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段)。
2024-04-26 14:59:16
830
2
原创 深入理解JVM运行时数据区
运行时数据区可简单分为Native Method Stack(本地方法栈)、Program Counter Register(程序计数器)、Java Virtual Machine Stack(虚拟机栈)、Heap(堆区)和Method Area(方法区)。在Java中存在一个类Runtime,该类采用了单例设计模式,每一个Java应用程序都有当前类Runtime的唯一实例。
2024-04-26 11:28:44
666
2
原创 从Kafka的可靠性设计体验软件设计之美
Kafka 中采用了多副本的机制,这是大多数分布式系统中惯用的手法,以此来实现水平扩展、提供容灾能力、提升可用性和可靠性等。副本(Replica)是分布式系统中常见的概念之一,指的是分布式系统对数据和服务提供的一种冗余方式。
2024-04-25 17:46:58
1410
2
ElasticSearch6.6全文检索.pdf
2024-06-21
Flink快速入门与实战.pdf
2024-06-21
完整版基于HDP搭建大数据学习基础环境.pdf
2024-06-21
Atlas元数据管理-v3.pdf
2024-06-17
DolphinScheduler工作流调度引擎.pdf
2024-06-17
JAVA中可伸缩IO的应用
2024-06-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人