- 博客(70)
- 收藏
- 关注
原创 MySQL是怎样运行的:从根儿上理解MySQL | 查询优化器(二):基于规则的优化
也就是说:在这种情况下:外连接和内连接也就没有什么区别了。
2022-09-14 17:22:56
3350
原创 MySQL是怎样运行的:从根儿上理解MySQL | B+树索引以及索引优化
概述我们知道聚簇索引的那棵 B+ 树的叶子节点中已经把所有完整的用户记录都包含了,而 MyISAM 的索引方案虽然也使用树形结构,但是却将索引和数据分开存储将表中的记录按照记录的插入顺序单独存储在一个文件中,称之为数据文件。这个文件并不划分为若干个数据页,有多少记录就往这个文件中塞多少记录就成了。我们可以通过行号而快速访问到一条记录。我们就以上面的表为例子,里面随便插点数据看看结构,可以看没有按照之间的顺序所以二分查找也是空谈使用 MyISAM 存储引擎的表会把索引信息另外存储到一个称为索引文件。
2022-09-06 12:10:11
3187
原创 MySQL是怎样运行的:从根儿上理解MySQL | 查询优化器(一):单表查询方法、基于成本的优化
概述I/O成本:将数据和索引从磁盘中加载到内存的过程称为IO成本CPU成本:读取以及检测记录是否满足对应的搜索条件、对结果集进行排序等这些操作损耗的时间称之为 CPU 成本。成本常数规定读取一个页面花费的成本默认是 1.0读取以及检测一条记录是否符合搜索条件的成本默认是 0.2。概述单次查询驱动表的成本多次查询被驱动表的成本(具体查询多少次取决于对驱动表查询的结果集中有多少条记录)扇出我们把对驱动表进行查询后得到的记录条数称之为驱动表的 扇出(英文名: fanout )。
2022-09-02 12:20:05
3121
原创 Linux内核设计与实现(九)| 进程地址空间(虚拟内存、页表)
这是零页的一个重要用处,而bss段需要的就是全0的内存区域。进程退出时,一般会调用三个相关结束工作的函数,一个是执行常规撤销工作,更新一些统计变量,并且其中会调用第二个函数去减少mm_users的数量,如果该值减少到0,会调用第三个函数减少mm_count的值,如果mm_count也为0了,系统会将mm_struct加入到lab中。虚拟内存区域对应的结构体制定地址空间内连续区间上的一个独立内存范围,这个内存范围会被独立的当做一个内存对象进行管理,每个内存对象都有相同的属性(访问权限等)和相同的操作;...
2022-07-27 23:02:18
3370
原创 Linux内核设计与实现(八)| 块I/O层(IO调度程序)
如果在写FIFO队列头,或是在读FIFO队列头的请求超时(也就是,当前时间超过了请求指定的超时时间),那么最后期限IO调度程序便从FIFO队列中提取请求进行服务。依靠这种方法,最后期限IO调度程序试图保证不会发生有请求在明显超期的情况下仍不能得到服务的现象。......
2022-07-24 21:13:10
3315
原创 Linux内核设计与实现(六)| 内存管理
内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻址单位通常为字(甚至字节),但是,内存管理单元(MMU,管理内存并把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理。不同体系结构页的大小也不一样,支持的页种类也不一样,大多数32位体系支持4KB的页,64位支持8KB的页。......
2022-07-21 00:45:55
2868
原创 Linux内核设计与实现(五)| 内核同步
对于用户空间而言内核中有类似可能造成并发执行的原因。简单的死锁案例编写代码时如何避免死锁SPARC体系结构:低8位的锁(已破译)原子整型的使用原子性与顺序性的比较1.2 原子位操作概述总结2.自旋锁概述2.1 自旋锁方法概述自旋锁与中断处理程序锁什么?死锁读写锁是可以重入的读写锁的API4.信号量概述信号量的特点4.1 计数信号量和二值信号量概述二值信号量计数
2022-07-07 16:29:34
3057
原创 Linux内核设计与实现(四)| 中断 & 中断处理(上半部与下半部)
异常网卡例子注意重入和中断程序分类::内核在处理中断处理程序本身不可被中断:—此标志表明这个设备产生的中断对内核饪池有贡献。内核嫡池负责提供从各种随机事件导出的真正的随机数。如果指定了该标志,你可理解为中断处理的时间不确定:该标志是特别为系统定时器的中断处理而准备的。:此标志表明可以在多个中断处理程序之间共享中断线5.中断上下文进程上下文和中断上下文的区别中断处理的要求中断处理程序栈内核的视角下面的几步其实就是引起中断的时候内核在干嘛,恢复到那个时候就行中断、锁和同步的配合禁止和激活
2022-07-05 22:18:44
4603
原创 Linux内核设计与实现(三)| 系统调用
以getpid()为例我们看看系统最终如何明确操作:3.1 系统调用号概述3.2 系统调用的性能概述4. 系统调用处理程序概述如何通知内核?返回值两个方法的伪代码检查是否有合法权限,检查特点资源的特殊权限即调用者调用函数来检查自己是否有权力对指定的资源进行操作,举个例子,可以检查调用者是否有权改变其他进程的值。6.系统调用上下文概述注意例子6.3 为什么不通过系统调用的方式实现概述平替方式...
2022-07-02 21:31:49
3192
原创 Linux内核设计与实现(二)| 进程调度
时间片策略Linux的策略Linux的优先级范围一般OS中的调度分配:Linux中:虚拟实时记账功能函数update_curr()5.2 进程选择概述挑选下一个任务向树中添加进程从树中删除进程5.3 调度器入口概述优化pick_next_task函数5.4 睡眠与唤醒睡眠概述等待队列:加入等待队列的步骤:唤醒概述两者状态的转换图(一次调度)6.抢占和上下文切换上下文切换所完成的工作:
2022-06-30 22:44:07
3739
原创 Linux内核设计与实现(一)| 进程管理
为什么有了IPC(进程间通信)机制?微内核在某些OS的改良Linux与Unix的显著差异内核开发的特点内联函数内核的内存不分页内核为什么要注意同步和并发进程的两种虚拟机制Linux中的进程创建2.2 进程描述符的存放标识进程:PID如何得到文件描述符:进程间状态转换内核经常需要调整某个进程的状态。这时最好使用set_task_state(task, state)函数;2.5 进程上下文概述2.6 进程家族树概述parent指针和children链表进程间的
2022-06-29 22:42:53
4466
原创 设计模式(三)| 行为型模式(责任链模式、观察者模式等)
优点缺点策略模式概述代码演示优化后:优点缺点模板方法模式概述UML类图钩子方法代码实例优点缺点职责链模式概述结构UML类图代码实例优点缺点适用备忘录模式概述模式结构代码演示未使用状态模式:重构后优点缺点中介者模式概述网状与星型结构模式结构优点模式结构优点......
2022-06-28 21:57:54
2638
原创 设计模式(二)| 结构型模式(适配器模式、代理模式等)
优点缺点桥接模式概述模式结构实例优点缺点装饰器模式概述装饰器和适配器的区别在于:优点缺点代理模式概述模式结构常见代理模式常用代理模式例如我们协议个黄牛代抢票的例子:...
2022-06-28 19:12:03
2536
原创 设计模式(一)| 创建型模式(单例模式、原型模式等)
直接赋值:枚举:懒汉式(受制于锁的性能限制)IoDH优点缺点代码演示:浅克隆:当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将被复制优点缺点工厂模式1.简单工厂模式概述角色构成代码实例.........
2022-06-28 00:11:09
2471
原创 Java集合相关总结(List | Set | Map)
get方法Set概述一、HashSet1.概述HashSet实现了Set接口HashSet实际上是HashMap,看下源码(图)可以存放null值,但是只能有一个nullHashSet不保证元素是有序的,取决于经过哈希函数计算过得结果后,再确定索引的结果.不能有重复元素或对象由图可以看到,在LinkedHashSet中存放数据的表的类型是HashMapNode,但元素的类型确实LinkedHashMapEntry,可以根据过往经验表示这两个类型的类绝对是继承关系Map与Colle
2022-06-27 21:37:41
3353
原创 Redis设计与实现(六)| 集群(分片)
clusterLink结构1.3 CLUSTER MEET命令的实现概述2.槽指派概述2.1 记录节点的槽指派信息概述slots数组总结2.2 传播节点的槽指派信息概述2.3 记录集群所有槽的指派信息概述获取键的槽3.2 判断槽是否由当前节点负责处理概述3.3 MOVED错误概述格式3.4 节点数据库的实现概述3.4.1 槽与键的映射关系及操作概述添加新的键值
2022-06-26 21:59:59
3379
原创 Redis设计与实现(五)| Sentinel哨兵
1.1 初始化服务器概述1.2 使用Sentinel专用代码概述1.3 初始化Sentinel状态概述1.4 初始化Sentinel状态的masters属性概述实体结构如下说明假如有两个这样的结构,那么宏观上就是如下图1.5 创建连向主服务器的网络连接概述2.获取主服务器信息概述更新slaves字典结构如下3.获取从服务器的信息概述4.向主服务器和从服务器发送消息概述信息有关参数
2022-06-26 21:57:49
251
原创 Redis设计与实现(四)| 主从复制
1.旧的主从复制概述1.1 同步流程图1.2 命令传播概述1.3旧版复制的的缺陷分为以下两种情况初次复制:从服务器从来没有复制过任何主服务器,或者从服务器复制当前的主服务和上一次的主服务器不一样,复制工作会很好的进行下来断线后复制:断线后从服务器会再一次进行同步工作,不过从主服务器发来的RDB文件是包括首次同步开始的命令到断连重连成功的命令,这个RDB文件十分大且重复,进行同步时会非常的慢。其实分析可知道我们不需要断连之前的所有命令,只需要断连之后到重连之间的命令对应的RDB
2022-06-26 21:55:18
534
2
原创 Redis设计与实现(三)| 服务器与客户端的交互(事件IO模型)
如下图所示,总计有四部分组成:套接字、多路复用器、文件事件分派器和事件处理器多路复用的工作流程命令请求处理器命令回复处理器整个流程
2022-06-26 21:54:26
632
1
原创 Redis设计与实现(二)| 数据库(删除策略&过期淘汰策略)
1.1 切换数据库概述1.2 数据库键空间概述例子查找(寻址)过程:过期键的判定:惰性删除策略的实现:定期删除策略的实现:LRU 的实现:LFU 的实现:
2022-06-26 21:52:11
324
原创 Redis设计与实现(一)| 数据结构 & 对象
记录长度值的两个好处:空间预分配:惰性空间释放:每个节点结构如下:链表的结构如下:总体形象化构成及特点:哈希节点的结构字典的结构3.2 哈希算法概述使用算法:①.分配:为字典的另一个哈希表分配空间,这个分配的空间取决于存储元素的(键值对的数量即属性的值)②.迁移重新hash:将0号表的键值对全部rehash到1号表中,即重新计算哈希值和索引值③.迁移后:迁移迁移完成之后,0号表为空表,释放0号表,将1号设置为0号,并创建一个新的1号表(未分配空间)为下一次迁移做准备①.
2022-06-26 21:03:53
583
原创 Java多并发(七)| Executor框架(四种线程池详解)
FixedThreadPool:SingleThreadExecutor:CachedThreadPool:ScheduledThreadPoolExecutor:SingleThreadScheduledExecutor:概述流程图如果使用无界队列作为工作队列的影响,队列容量是MAX2.2 SingleThreadExecutor详解代码概述流程图2.3 CachedThreadPool详解代码概述流程图Synchronou
2022-06-25 21:04:51
1658
原创 Java多并发(六)| 线程池的基本概述(阻塞队列)
ArrayBlockingQueue(有界任务队列):LinkedBlockingQueue(无界任务队列):::SynchronousQueue(直接提交队列):PriorityBlockingQueue(优先任务队列):5.ThreadFactory(线程工厂)代码如下:6.keepAliveTime(存活时间) & unit(时间单位)概述3.向线程池提交任务的两种方式:execute()&submit()概述execute():submit():注意4监
2022-06-25 21:01:37
2323
原创 Java多并发(五)| JUC包下的并发容器(ConcurrentHashMap)& 并发工具类 & 原子变量类
jdk7和jdk8的区别效率底下的HashTableConcurrentHashMap的锁分段技术可以有效提高并发访问率1.2 JDK1.7与1.8的区别主要概括初始化segmentShift和segmentMask(注意:segmentShift != sshift)初始化每个segment定位Segmentget()方法put()方法是否需要扩容:如何扩容:2.3 定位尾节点概述2.4 设置入队节点为尾节点
2022-06-25 20:08:47
1565
原创 Java多并发(四)| 锁(Lock接口 & AQS & ReentrantLock)
美团技术团队的文章,建议阅览1.2 Lock接口提供的synchronized关键字不具备的主要特性概述Lock相对于synchronized的缺点1.3 Lock接口的相关API图示基本结构节点的属性类型与名称及描述acquire方法引申出的addWaiter方法和enq方法acquire方法引申出的acquireQueued方法同步器的acquire方法调用流程图同步器的release方法即释放3. 共享式同步状态的获取和释放概述实现可
2022-06-25 19:28:44
1260
原创 Java多并发(三)| 线程间的通信(ThreadLoacl详解)
Runnable:Running和Ready的合并几个方法的比较:初始化线程:开启线程的四种方式:实现Runnable接口实现Callable接口+FutureTask(可以拿到返回结果,可以处理异常)线程池(以后的章节会详解)四种方式的对比:理解中断:volatile关键字的通信:synchronized的通信(同步方法、代码块):Lock接口的各种锁:原子变量:结果分析调用过程图示细节:等待队列和同步队列的线程被notify通知后的行为:...
2022-06-25 19:15:57
799
原创 Java多并发(二)| cas & synchronized & volatile的内存语义
CAS实现原子操作的三大问题:synchronized关键字的修饰对象synchronized关键字修饰对象示例:修饰方法的语法:修饰静态方法的语法:1.2 内存语义对于同步块对于同步方法Java的对象头:对象头在Java内存中宏观存储位置如下图Java对象头的长度状态变化:偏向锁设置过程:偏向锁的撤销(升级为轻量级锁):偏向锁的关闭:轻量级锁加锁:轻量级锁解锁(升级为重量级锁):若当前只有一个等待线程,则该线程通过自旋进行等待。但是当自旋超过一定的次数,或者一个
2022-06-25 00:40:24
248
原创 Java多并发(一)| 并发机制的底层原理(内存模型、重排序)
对于上下文,先来了解下时间片:在并发编程中两个关键问题就是:锁的释放-获取建立的happens-before关系:锁的释放和获取的内存语义:锁释放与获取的总结:分类:final关键字(域)的重排序规则:对于final域,编译器和处理器要遵守两个重排序规则。分类:双重加锁代码2.1 双重锁定出现的问题概述分析问题根源的底层支持2.2 基于问题的解决方案-volatile概述优化代码2.3 基于问题的解决方案-类初始化(登记式/静态内部类)概述
2022-06-24 21:24:11
863
原创 关于极客时间 | MySQL实战45讲的部分总结
MySQL为什么有时候会选错索引1.MySQL选择索引的依据概述mysql选择索引无非就是优化器觉得哪一种索引的成本执行低,优化器会从该索引的扫描行数、是否会用到临时表及是否要进行排序来进行综合判断1.1 基于主键的成本计算概述对于主键来说就是计算全表扫描的成本,取决于下面两个方面聚簇索引占用的页面数该表中的记录数该表中的记录数对于这个数据的获取,mysql使用的是统计数据中的估计值,每个表都会有一些列的统计信息,本选项表示表中的记录条数。对于使用 MyISAM
2022-06-24 16:57:43
4417
原创 计算机网络 | 网络概述(什么是互联网 & 互联网结构)
从具体构成角度来看:从服务角度来看:端到端的资源被分配给从源端到目标端的呼叫“call”根据上图可以得到的信息每段链路有四条线路或片(piece),该次呼叫使用了上面链路的第二条线路和右边链路的第一条线路每个呼叫一旦建立就能保证其性能,即资源不同享(共享资源的能力较差)如果呼叫中没有信息的传输,称为该次呼叫是“浪费”的常应用于传统电话网络说明:根据此图我们就可以很生动的理解互联网为什么被我们称为网络中的网络,我们可以分为三层,所以一个会话分组其实要经过很多ISP也就是经过很多网络注意:......
2022-06-23 19:53:16
3646
原创 计算机网络 | 应用层
2.进程通信对于本地的进程对于进程处于不同的主机2.1 分布式进程之间的通信注意:在看此节之前,应先阅读第三节关于socket的讲解分布式进程需要解决的三个问题:对于使用面向连接服务(TCP)的应用而言,套接字是4元组的一个具有本地意义的标示需要在本地维护如下图所示的一张表对于使用无连接服务(UDP)的应用而言,套接字是2元组的一个具有本地意义的标示URL(通用资源定位符)格式:我们通过URL来进行对每个对象的引用访问大部分状态码作用:不访问原始服务器,就满足客户的请求缓存是为了
2022-06-23 19:51:48
2358
原创 计算机网络 | 传输层 | TCP&UDP |可靠传输
网络层服务(主机之间逻辑通信)传输层服务(进程间的逻辑通信)类比网络层和传输层之间的角色“尽力而为”的服务,报文段可能丢失、送到应用进程的报文段乱序无连接多用于网络流媒体即对信息丢失不敏感,对速率敏感的应用适合想要在UDP上进行可靠传输就要在应用层下功夫了如果有序号的存在,那么一定要约定同步(值相同),也就是序号同步开始或结束rdt在应用层、传输层和数据链路层都很重要是网络Top 10问题之一信道的不可靠特点决定了可靠数据传输协议( rdt )的复杂性渐增式地开发可靠数据传输协议( rdt)的发送方和接收方
2022-06-23 19:36:49
2521
原创 计算机网络 | 网络层(控制平面)
全局或者局部路由信息?静态或者动态的?各路由器维护一张路由表,结构如图(其它代价) ,维护全部的节点各路由器与相邻路由器交换路由表(待续)根据获得的路由信息,更新路由表(待续)如果180秒没有收到通告信息----->邻居或者链路失效为什么运行ping 127.0.0.1时,不能捕获到ICMP报文?如果运行ping 本机IP地址能收到报文吗?:......
2022-06-23 19:10:34
2750
原创 计算机网络 | 网络层(数据平面)
SDN(software-defined networking ):来了分组后,分组所在的帧和分组本身的所有字段提取出来与交换机的维护的流表(由专门的网络操作系统算出来)中的字段相匹配,对匹配得到的结果进行操作,可以进行转发或者阻止或者泛洪或者字段修改逻辑集中的控制平面优点对于单个数据报的服务:对于数据报流的服务:当交换机构的速率小于输入端口的汇聚速率时→在输入端口可能要排队,这时就需要在输入端口处有一个队列(同理是队列就会操作数据的丢失),来控制不同输入端口发送到同一个输出端口时的竞争问题Head-o
2022-06-23 19:09:59
3182
原创 计算机网络 | 数据链路层 & 局域网
网络层解决了一个网络如何到达另外一个网络的路由问题在一个网络内部如何由一个节点(主机或者路由器)到达另外一个相邻节点一个子网中的若干节点是如何连接到一起的有更简单的检查方法全部加起来看是不是全1实际中广泛使用(以太网、802.11 WiFi、ATM)相关解释:生成多项式(确定二进制码)移位:相除给定:Rbps的广播信道必要条件:概述发送方和接收方IEEE 802.11 MAC 协议: CSMA/CA冲突避免(预约)Walkthrough :发送数据报:由A通过R到B,假设A知道B的IP地址帧传
2022-06-23 17:33:01
2324
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅