MySQL 优化

配置优化指的 MySQL 的 server 端的配置,一般对于业务方而言,可以不用关注,毕竟会有专门的 DBA 来处理,但是对于原理的了解,我想,我们开发,是需要了解的

作者:吴德宝 AllenWu
链接:https://juejin.cn/post/6844903555141206030

阅读更多

MySQL 索引

MySQL 支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此 MySQL 数据库支持多种索引类型,如 BTree 索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于 BTree 索引,因为这是平常使用 MySQL 时主要打交道的索引。

MySQL 官方对索引的定义为:索引(Index)是帮助 MySQL 高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。

作者:吴德宝 AllenWu
链接:https://juejin.cn/post/6844903555141206030

阅读更多

Golang的反射reflect深入理解

在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

每种语言的反射模型都不同,并且有些语言根本不支持反射。Golang 语言实现了反射,反射机制就是在运行时动态的调用对象的方法和属性,官方自带的 reflect 包就是反射相关的,只要包含这个包就可以使用。

多插一句,Golang 的 gRPC 也是通过反射实现的。

作者:吴德宝 AllenWu
链接:https://juejin.cn/post/6844903559335526407

阅读更多

Debian 10 安装 AMD 显卡驱动

启用 Non-Free 存储库

1
2
3
4
5
deb http://deb.debian.org/debian/ buster main non-free contrib
deb-src http://deb.debian.org/debian/ buster main non-free contrib

deb http://security.debian.org/debian-security buster/updates main contrib non-free
deb-src http://security.debian.org/debian-security buster/updates main contrib non-free
阅读更多

MySQL 创建存储过程与函数

存储过程

1
2
3
4
CREATE
[DEFINER = user]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
  • proc_parameter [ IN | OUT | INOUT ] 参数名 参数类型
  • routine_body 函数体
阅读更多

RxJS 源码解析(六): Scheduler

在这之前,我一直都没有讲过 Scheduler 的作用,那么本章就开始讲解 Scheduler 的设计思路和基本结构。RxJS 的存在是为了处理异步 IO,而异步 IO 所包含的一系列 API 肯定也是要经过进一步的封装才能让 RxJS 中的异步操作使用。

可以看到,它主要还是根据 JS 的所能够提供的异步能力来设计这些基本结构。

  • AsyncScheduler 异步调度器,使用 setInterval 实现。
  • QueueScheduler 队列异步调度器,继承了 AsyncScheduler,但是 QueueAction 是一种链式结构,使得调度以迭代器的形式进行。
  • AnimationFrameScheduler 使用 reqeustAnimationFrame 实现了帧调度器。
  • AsapScheduler 使用 Promise.resolve().then() 实现的微任务调度器。

作者:zcx
链接:https://mp.weixin.qq.com/s/vG0aaQmDy7Cqfv0CwJ_d0Q

阅读更多

RxJS 源码解析(五): Operator III

在本文开始之前,先定义一些自定义术语,方便阅读。

  • 顶流:调用了操作符的流。
  • 上游流:操作符的内部订阅器所订阅的流。
  • 下游流:由操作符的内部订阅器管理的流。
  • 终结订阅:订阅了操作符生成的流的订阅者。

在上一篇中,我描述了 OuterSubscriber 和 InnerSubscriber 的作用,并将几个 Join Creation Operator 的源码解析了一遍。下面,我们将进入的是 Transformation Operator 的源码分析。

在知道了 OuterSubscriber 和 InnerSubscriber 是一种通过委托模式实现管理下游流订阅的方法后,我发现其实这种实现技巧用于很多的 operators。那么本篇及下一篇将会介绍更多这种类似的设计。

作者:zcx
链接:https://mp.weixin.qq.com/s/lrawMOuHNj6GyQJMqK1Now

阅读更多

RxJS 源码解析(四): Operator II

在本文开始之前,先定义一些自定义术语,方便阅读。

  • 顶流:调用了操作符的流。
  • 上游流:操作符的内部订阅器所订阅的流。
  • 下游流:由操作符的内部订阅器管理的流。
  • 终结订阅:订阅了操作符生成的流的订阅者。

我并不打算像上一篇那样,抓着几个操作符一顿输出。从这篇开始,无论是 Join Operator、还是 Transformation Operator,都有很大的规律性。所以我想先总结出来它们的规律,再来对 operator 进行分析。

作者:zcx
链接:https://mp.weixin.qq.com/s/1b141waT_tAxZR-PZC79kg

阅读更多

RxJS 源码解析(三): Operator I

在 RxJS 中,Creation Operator 主要分为以下两类:

  • 执行一般创建操作的 Normal Creation Operator。
  • 执行复杂的创建操作的 Join Creation Operator。

在 pipe 中使用的 operator ,我称之为 Pipe Operator ,它主要分为以下几类:

  • 用于数据映射的 Transformation Operators
  • 过滤用的 Filtering Operators
  • 将当前的 Observable 多播化的 Multicasting Operators
  • 处理错误的 Error Handling Operators
  • 工具操作函数 Utility Operators
  • Conditional and Boolean Operators
  • Mathematical and Aggregate Operators

限于篇幅本篇将先介绍 Normal Creation Operator ,它的主要作用是帮助开发者快速创建 Observable。

作者:zcx
链接:https://mp.weixin.qq.com/s/vIXe_cywMTv03njLLtvQNQ

阅读更多

RxJS 源码解析(二): Muticasted Observable

我们分析了 Oberservable 和 Subscription 的具体实现方法。这一篇,将会了解一系列不同的 Muticasted Observable(多播观察源),这些 Observable 在 RxJS 中主要是以 Subject 命名,它们有以下几种不同的实现:

  • Subject
  • AnonymousSubject
  • BehaviorSubject
  • ReplaySubject
  • AsyncSubject

所谓 Muticasted Observable,就是这个 Observable 可以持续的发送数据给到订阅它的订阅者们。

作者:zcx
链接:https://mp.weixin.qq.com/s/i14brW_Ok8JYGoBIcfhs5Q

阅读更多