自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(108)
  • 收藏
  • 关注

原创 2023「总结」,2024「展望」

时光荏苒,岁月如梭,转眼已经进入2024年了。回想过去的2023年,成长了很多,有收获,有付出,也有一丝丝的遗憾。其实在写这篇文章之前我思考了很久,一直不知如何下手,也许这是一个新手都会遇到的问题,这也是我第一次做年度复盘。所以我看了很多网友的复盘帖并从中学习一些复盘经验,不断总结自己这一年的经历。对自己在过去的2023年从多个方面进行了总结。

2024-01-06 14:26:53 400

原创 16、Mysql用户工具

接口工具Mysql WorkbenchSQLyogphpMyAdminAdminer命令行工具集Percona ToolkitMaatkit and AspersaThe openark kitMysql Workbench工具集SQL实用集common_schemamysql-sr-libMysql UDF库Mysql Forge监测工具开源的监控工具NagiosZabbixZenossHyperic HQOpenNMSGroundwork Open Sourc

2024-01-02 21:08:57 383

原创 15、备份与恢复

备份在先,只有已经做了备份才可能恢复。备份由脚本和任务自动完成。备份是日常任务,但是恢复常常发生在危急情况下。因为安全的需要,如果正在做异地备份,可能需要对备份数据进行加密或采取其他措施来保护。只有一个人来规划、设计和实施备份。规划备份和恢复策略时,有两个重要的需求可以帮忙思考:恢复点目标和恢复时间目标。他们定义了可以容忍丢失多少数据,以及需要等待多久将数据恢复。

2024-01-02 21:02:30 1063

原创 14、应用层优化

缓存对高负载应用来说是至关重要的,一个典型的Web应用程序会提供大量的内容,直接生成这些内容的成本比采用缓存要高得多,所以采用缓存通常可以获得数量级的性能提升。因为应用可以缓存部分计算结果,所以应用层缓存可能比更低层次的缓存更有效。在更改旧数据时,为了避免要同时失效派生出来的脏数据,可以在缓存中保存一些信息,当从缓存中读数据时可以利用这些信息判断数据是否已经失效。最常见的问题是保持他的进程的存活时间过长,或者在各种不同的用途下混合使用,而不是分别对不同类型的工作进行优化。

2024-01-01 16:52:53 389

原创 13、云端的Mysql

Mysql并不会在云端自动变得更具扩展性。事实上,如果机器的性能较差,会导致过早使用横向扩展策略。况且云托管服务相比专用的硬件可靠性和可预测性要更差写,所以想在云端获得高可用性需要更多的创新。在一些场景下云托管比传统的服务器部署方式更经济。云托管比较适合处于初级阶段的企业,或者那些持续接触新概念并且本质上是以适用为主的企业。由于较差的CPU、内存以及IO性能。在类似AWS这样的云托管平台上Mysql表现出来的性能并不如在其他地方好。Mysql需要四种基础资源来完成工作:CPU周期、内存、IO,以及网络。

2024-01-01 15:25:05 353

原创 12、高可用性

高可用性不是绝对的,只有相对更高的可用性。百分之百的可用性是不可能达到的。可用性的定义不仅仅包括服务正在运行的时间段,还包括应用是否能以足够好的性能处理请求。

2024-01-01 15:14:46 708

原创 11、可扩展的Mysql

另一种说法,可扩展性是当增加资源以处理负载和增加容量时系统能够获得的投资产出率。

2023-12-30 17:29:52 401

原创 10、复制

如果没有在 my.cnf 里定义服务器ID,可以通过 CHANGE MASTER TO来设置备库。但是却无法启动复制。必须为备库显示的设置服务器ID。

2023-12-30 14:51:51 1055

原创 9、操作系统和硬件优化

许多不同的硬件都会影响Mysql的性能,最常见的两个瓶颈是CPU和IO资源。当数据可以放在内存中或者可以从磁盘中以足够快的速度读取时,CPU可能出现瓶颈。IO瓶颈一般发生在所需要的数据远远超过有效内存容量的时候。如果应用程序是分布在网络上,或者如果有大量的查询和低延迟的要求,瓶颈可能转移到网络上,而不再是磁盘IO。

2023-12-24 20:25:32 339

原创 8、优化服务器设置

首先我们应该知道的是Mysql从哪里获取配置信息:命令行参数和配置文件。如果打算长期使用某些配置那么就应该写到全局配置文件,而不是在命令行指定。

2023-12-23 21:54:38 942

原创 7、Mysql高级特性

分区表是一个独立的逻辑表,但是底层由多个物理子表组成。实现分区的代码实际上是对一组底层表的句柄对象的封装。对分区表的请求,都会通过句柄对象转化成对存储引擎的接口调用。Mysql实现分区表的方式是对底层表的封装,意味着索引也是按照分区的子表定义的,而没有全局索引。Mysql在创建表时使用 PARTITION BY 子句定义每个分区存放的数据,在执行查询的时候,优化器会根据分区定义过滤那些没有我们需要数据的分区,这样查询就无须扫描所有分区。分区的一个主要目的是将数据按照一个较粗的粒度分在不同的表中。

2023-12-17 21:33:43 66

原创 6、查询性能优化

在编写快速查询之前,需要清楚一点,真正重要的是响应时间。如果把查询看作是一个任务,那么他由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行的更快。查询性能低下最基本的原因是访问的数据太多。某些查询不可避免地需要筛选大量数据,但这并不常见。大部分性能低下的查询都可以通过减少访问的数据量的方式进行优化。对于低效的查询,我们发现可以通过下面两个步骤来分析:有些查询会请求超过实际需要的数据,然后这些多余的数据会被

2023-12-16 20:27:29 503

原创 算法基础十五

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。示例 1:输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5]解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:示例 2:输入:nums = [1,3] 输出:[3,1]

2023-12-16 11:12:50 360

原创 算法基础十四

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。示例 1:输入:s = “Hello World” 输出:5 解释:最后一个单词是“World”,长度为5。示例 2:输入:s = " fly me to the moon " 输出:4 解释:最后一个单词是“moon”,长度为4。

2023-12-16 10:59:59 44

原创 算法基础十三

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树。可以按 任意顺序 返回答案。示例 1:输入:n = 3输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]示例 2:输入:n = 1 输出:[[1]]

2023-12-12 21:31:49 69

原创 算法基础十二

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字。返回 已排序的链表。示例 1:输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]示例 2:输入:head = [1,1,1,2,3] 输出:[2,3]

2023-12-11 21:13:26 65

原创 算法基础十一

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。示例 1:输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]示例 2:输入:n = 1, k = 1 输出:[[1]]解题思路:DFS。

2023-12-10 20:19:26 135

原创 算法基础十

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。示例 1:输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。示例 2:输入:digits = [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321。示例 3:输入:digits = [0]解题思路:给定数组代表一个十进制数,数组的0下标是十进制的高位。从数组尾部开始遍历,依次进位。

2023-12-10 19:45:39 96

原创 算法基础九

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix。示例 1:输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:输入:n = 1 输出:[[1]]解题思路:里面元素是1 - n*n,并且数组是顺序螺旋排列。

2023-12-10 19:21:00 739

原创 5、创建高性能的索引

单行访问时很慢的。如果服务器从存储中读取一个数据块只是为了获取其中一行,那么就浪费了很多工作。最好读取的块中能包含尽可能多所需要的行。按顺序访问范围数据是很快的。第一,顺序IO不需要多次磁盘寻道,所以比随机IO要快很多;第二,如果服务器能够按需要顺序读取数据,那么就不再需要额外的排序操作,并且GROUP BY查询也无须再做排序和将行按组聚合计算了。索引覆盖查询是很快的,避免了回表查找。

2023-12-10 16:24:33 502

原创 算法基础八

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。示例 1:输入:x = 2.00000, n = 10 输出:1024.00000示例 2:输入:x = 2.10000, n = 3 输出:9.26100解题思路:用递归的方式,将n 二分下去,注意n的正负和奇偶。

2023-12-09 13:35:00 158

原创 算法基础七

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。示例 1:输入:nums = [1,2,0] 输出:3示例 2:输入:nums = [3,4,-1,1] 输出:2示例 3:输入:nums = [7,8,9,11,12] 输出:1解题思路:为了减少复杂度,可以把数组缓存到map中,然后将 i 从1开始循环,一次对比map中是否存在 i 只要不存在就立即返回结果 i。

2023-12-09 12:44:35 158

原创 算法基础六

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。示例 1: 输入: nums = [1,3,5,6], target = 5 输出: 2示例 2: 输入: nums = [1,3,5,6], target = 2 输出: 1示例 3: 输入: nums = [1,3,5,6], target = 7 输出: 4解题思路:二分搜索。

2023-12-04 21:47:24 402

原创 4、Schema与数据类型优化

良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema,这往往需要权衡各种因素。例如,反范式的设计可以加快某些类型的查询,但同时可能使另一些类型的查询变慢。比如添加计数表和汇总表时一种很好的优化查询的方式,但这些表的维护成本很高。

2023-12-03 20:34:49 280

原创 算法基础五

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。示例 1:输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4]示例 2:输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1]示例 3:输入:nums = [], target = 0 输出:[-1,-1]

2023-12-03 11:04:25 126

原创 3、服务器性能剖析

*我们将性能定义为完成某件任务所需要的时间度量,换句话说,性能即响应时间,这是一个非常重要的原则。**我们通过任务和时间而不是资源来测量性能。数据库服务器的目的是执行sql语句,所以他关注的任务是查询或者语句,如SELECT、UPDATE、DELETE等。数据库服务器的性能用查询的响应时间来度量。单位是每个查询花费的时间。假如你认为性能优化是降低CPU利用率,那么可以减少对资源的使用。但是资源是用来消耗并用来工作的,所以有时候消耗更多的资源能够加快查询速度。

2023-12-02 19:43:41 223

原创 算法基础四

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:示例 1:输入:n = 3 输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]示例 2:输入:n = 1 输出:[“()”]解题思路:回溯算法。这一类问题是在一棵隐式的树上求解,可以用深度优先遍历,也可以用广度优先遍历。一般用深度优先遍历。原因是:1.代码好写,使用递归的方法,直接借助系统栈完成状态的转移;

2023-12-02 14:05:06 211

原创 算法基础三

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

2023-12-01 10:36:57 88

原创 算法基础二

给你一个整数 x ,如果 x 是一个回文整数,返回 true;否则,返回 false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。解题思路:注意负数,10的情况。

2023-11-28 21:45:12 147

原创 算法基础一

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。解题思路:这道题最优的做法时间复杂度是O(n),顺序扫描数组,对每一个元素在map中找能组合给定值的另一半数字,如果找到了直接返回2个数字的下标。如果找不到就把数字放入map,进入下一次循环。

2023-11-26 22:06:37 310

原创 2、Mysql基准测试

准测试是针对系统设计的一种压力测试。通常的目标是为了掌握系统的行为。

2023-11-26 10:38:48 249

原创 1、Mysql架构与历史

所谓幻读就是说当某个事务在读取某个范围内的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围内的记录时,会产生幻行。MVCC是如何操作的。事务日志可以帮助提高事务的效率,使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久化的事务日志中,而不用每次都将修改的数据本身持久化到磁盘。写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是处于安全策略的考虑,只有这样,才能确保在给定的时间内,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。

2023-11-25 21:08:43 222

原创 ConcurrentHashMap原理

这样就可以在不影响读操作的情况下,同时支持多个线程的并发写操作。ConcurrentHashMap的迭代器创建后,就会按照哈希表结构遍历每个元素,但在遍历过程中,内部元素可能会发生变化,如果变化发生在已遍历的部分,迭代器就不会反映出来,而如果变化发生在未遍历过的部分,迭代器就会发现并反映出来,这就是弱一致性。CAS 其实是一种乐观锁,一般有三个值,分别为:赋值对象,原值,新值,在执行的时候,会先判断内存中的值是否和原值相等,相等的话把新值赋值给对象,否则赋值失败,整个过程都是原子性操作,没有线程安全问题。

2023-03-21 22:26:35 450

原创 HashMap原理

哈希冲突是由于hash算法被计算的数据是无限的,而计算后的结果范围是有限的,所以总会存在不同的数据计算后得到的值是一样的,那将会存在同一个位置,就会出现哈希冲突。加载因子 = 填入表中的元素个数 / 散列表的长度加载因子越大,填满的元素越多,空间利用率越高,但发生冲突的机会变大了;加载因子越小,填满的元素越少,冲突发生的机会减小,但空间浪费了更多了,而且还会提高扩容rehash操作的次数。冲突的机会越大,说明需要查找的数据还需要通过另一个途径查找,这样查找的成本就越高。

2023-03-12 20:21:58 2237

原创 设计模式之访问者模式

访问者模式提供了一个作用于某对象结构中的各元素的操作表示,他使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式主要包含以下几个角色:Vistor(抽象访问者):为对象结构中每一个具体元素类声明一个访问操作,从这个操作的名称或参数类型可以清楚的知道需要访问的具体元素类型,具体访问者需要实现这些操作方法,定义对这些元素的访问操作。ConcreteVistor(具体访问者):实现了每一个由抽象访问者声明的操作,每一个操作用于访问对象结构中一种类型的元素。

2023-02-19 21:11:28 387

原创 设计模式之模板方法模式

模板方法模式定义了一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构就可以重定义该算法的某些特定步骤。模板方法模式主要包含几下几个角色:AbstractClass(抽象类):在抽象类中定义了一系列基本操作,这些操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在子类中可以重定义或实现这些步骤。同时在抽象类中实现了一个模板方法用于定义一个算法的框架,模板方法不仅可以调用抽象类中实现的方法,也可以调用子类中实现的基本方法。

2023-02-19 18:00:28 393

原创 设计模式之策略模式

策略模式定义了一系列算法类,将每一个算法封装起来,并让他们可以相互替换,策略模式让算法独立于客户端。策略模式主要包含以下几个角色:Context(环境类):使用算法的角色,在解决某个问题(即实现某个方法)时可以采用多种策略,在环境类中维持一个抽象策略类的引用实例,用于定义所采用的策略。Strategy(抽象策略类):为所支持的算法声明抽象方法,是所有策略类的父类,可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的方法。

2023-02-19 16:10:53 327

原创 设计模式之状态模式

状态模式是指允许一个对象在其内部状态改变时改变他的行为,对象看起来似乎改变了整个类。状态模式将一个对象在不同状态下的不同行为封装在一个个状态类中,通过设置不同的状态对象可以让环境对象拥有不同的行为,而状态转换的行为对客户端是透明的。状态模式主要包含以下几个角色:Context(环境):拥有多种状态的对象,由于环境类的状态存在多样性且在不同状态下对象的行为有所不同,因此将状态独立出来形成单独的状态类。

2023-02-18 16:42:25 525

原创 设计模式之观察者模式

观察者模式定义了对象之间一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都能收到通知并自动刷新。观察者模式主要包含以下几个角色:Subject(目标):指被观察的对象,在目标中定义了一个观察者集合,一个观察目标可以接受任意数量的观察者来观察。提供了一系列方法来增加,删除观察者对象,同时也定义了通知方法。目标类可以是接口也可以是抽象类。ConcreteSubject(具体目标):目标类的子类,通常包含经常发生改变的数据,当他的状态发生改变时,向他的各个观察者发出通知。

2023-02-18 11:38:56 491

原创 设计模式之备忘录模式

备忘录模式是指在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将该对象恢复到原先保存的状态。备忘录模式主要包含以下几个角色:Originator(原发器):是一个普通类,可以创建一个备忘录,并存储当前的内部状态,也可以使用备忘录来恢复其内部状态,一般将需要保存内部状态的类设计为原发器。Memento(备忘录):存储原发器的内部状态,根据原发器来决定保存哪些内部状态。备忘录的设计一般可以参考原发器的设计,根据实际需要确定备忘录类中的属性。

2023-02-16 21:07:05 64

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除